C++中函数返回大型对象是效率的大敌。但是正如 EffectiveC++ 条款23 [ EC 23 ] 指出的, 有时候你一定得按值返回对象。譬如,你有一个稀疏矩阵类,它包含:
class Matrix{
std::vector< Elem > _data;
size_t _row, _col;
};
现在他的矩阵乘法函数就必须返回一个新的 SparseMatrix:
const Matrix operator* ( ) ( const Matrix& rhs ) {
Matrix mat( _row, rhs._col ); // MAT_1
//...
return mat; // MAT2 = MAT1
}
mat_l = mat_a * mat_b; // mat_l = MAT2
数数 return 处执行了多少次拷贝/赋值么? 最悲惨的情况是 —— 我们竟然需要两次无意义的拷贝!
MAT_1 用于完成运算,并在返回时构造 MAT_2 ,并马上析构。 MAT_2 赋值给mat_l,同样马上析构。 其中,这个可能包含数百上千元素的 vector 成员将被逐字拷贝两次(可能还包括大量的动态内存分配等等)。这的确是无谓的开销阿,而如果设计允