我只是对复制赋值运算符和移动赋值运算符的运行时有疑问。我希望移动赋值运算符运行得更快,但我发现它们以完全相同的速度运行(或多或少)。
这让我相信我做了一些不正确的事情,或者我正在复制我不应该做的事情。如果有人可以对此有所了解,我将不胜感激。
复制赋值运算符(运行时间为1.235秒):
w3::DArray2d& w3::DArray2d::operator=(w3::DArray2d& rhs){
// std::cout << "assignment operator" << std::endl;
if ( this != &rhs )
{
delete [] array;
array = new double*[rhs.columns];
for (int i=0; i < rhs.columns; i++){
array[i] = new double[rhs.rows];
}
this->rows = rhs.rows;
this->columns = rhs.columns;
// std::cout << this->rows << std::endl;
// std::cout << this->columns << std::endl;
for(int a = 0; a < rhs.rows; a++){
for(int b = 0; b < rhs.columns; b++){
array[a][b] = rhs.array[a][b];
}
}
}
return *this;
}
移动分配操作员(运行时1.233s):
w3::DArray2d& w3::DArray2d::operator=(w3::DArray2d::DArray2d&& rhs){
if(this != &rhs){
rows = std::move(rhs.rows);
columns = std::move(rhs.columns);
array = std::move(rhs.array);
// reset rhs
rhs.rows = 0;
rhs.columns = 0;
rhs.array = nullptr;
}
return *this;
}
这是5000x5000二维数组的运行时,使用当前时间作为种子填充从0.00到1.00的随机值。
这是我计算时间的方式:
#define TIME(start, end) double((end) - (start)) / CLOCKS_PER_SEC
std::clock_t cs, ce;
cs = std::clock();
a = std::move(b);
ce = std::clock();
std::cout << "Move Assignment " << TIME(cs, ce) << " seconds";
std::cout << " - a.check = " << a.check();
std::cout << " - b.check = " << b.check() << std::endl;