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

C++函数返回对象时copy constructor未触发,原因何在?

为什么返回对象时没触发拷贝构造函数?

你遇到的是C++里的返回值优化(RVO),这是编译器默认会做的优化,目的是避免不必要的对象拷贝,提升程序性能。

具体到你的代码:

在foo_bar()函数里,你创建了Point point然后返回它。按照常规逻辑,应该会把这个局部对象拷贝一份返回给调用方,但编译器直接做了优化:它跳过拷贝步骤,直接在调用方(main函数里接收返回值的临时对象内存位置)构造这个Point对象。所以整个过程只调用了两次默认构造(main里的A,以及foo_bar里被优化到调用方位置的point),对应两次析构,完全没触发拷贝构造。

怎么验证这个优化的存在?

你可以关闭编译器的RVO优化,比如用GCC或Clang编译时加上-fno-elide-constructors参数,再运行代码就能看到拷贝构造函数被调用的输出了:

constructor Point()
constructor Point()
copy constructor Point(const Point&)
destructor ~Point()
destructor ~Point()
destructor ~Point()

注意事项:

C++标准明确允许编译器进行这类优化,哪怕你的拷贝构造函数有可见的副作用(比如这里的打印输出),编译器也有权选择跳过拷贝。所以在实际开发中,不要依赖拷贝构造函数的调用次数来实现核心逻辑。

内容的提问来源于stack exchange,提问作者一碗给力嗯

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:50:02