手动使用Move语义,减少按值返回对象操作的开销

本文探讨了C++中按值返回大型对象导致的效率问题,尤其是涉及矩阵类操作时的拷贝开销。通过介绍RVO(返回值优化)和C++0x的Move语义,提出手动实现Move语义的方法,如添加non-const成员函数`moveTo`,以减少不必要的拷贝,提高性能。文章提供了示例代码,展示了如何在矩阵乘法等操作中应用这些优化技巧。
摘要由CSDN通过智能技术生成

    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 成员将被逐字拷贝两次(可能还包括大量的动态内存分配等等)。这的确是无谓的开销阿,而如果设计允

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值