C++自定义BigInteger类加法运算符触发两次拷贝构造函数的原因
问题分析
两次拷贝构造的触发原因
- 第一次拷贝构造:
operator+采用值传递形参,你定义的operator+签名为BigInteger operator+(BigInteger rhs),调用a + b时,实参b需要拷贝构造给形参rhs,触发第一次调用。 - 第二次拷贝构造:你当前的
operator+实现是直接返回rhs += *this,而operator+=的返回类型是左值引用BigInteger&,这个表达式的结果是指向局部变量rhs的左值,用左值构造返回值对象时会触发第二次拷贝构造。
优化方案
修改operator+的实现逻辑,将运算和返回拆分,让编译器可以优先调用移动构造,甚至触发复制消除省掉多余的构造开销:
BigInteger operator+(BigInteger rhs) { rhs += *this; return rhs; }
修改后返回的是函数内的局部值对象,编译器会优先匹配移动构造生成返回值,开启O2优化后还会触发返回值优化(RVO),完全省略移动构造的开销,最终仅会保留参数拷贝的1次拷贝构造调用,符合你的预期。
内容的提问来源于stack exchange,提问作者Learpcs
相关产品推荐
相关产品推荐

