You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:45:03