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

为何C++中拷贝构造函数未被调用?

为什么拷贝构造函数没有被调用?

你遇到的情况是C编译器的**返回值优化(Return Value Optimization, RVO)**导致的。这是C标准允许的性能优化手段,编译器会在特定场景下省略拷贝/移动构造函数的调用,直接在目标对象的内存位置构造临时对象,以此避免不必要的拷贝开销。

代码流程分析

你的代码逻辑中:

  • GetTemp()函数内部创建了一个HasPtrMem临时对象
  • 按照未优化的常规流程,这个临时对象需要被拷贝到main()里的a对象中,此时应该触发拷贝构造函数
  • 但编译器启用RVO后,会直接在a的内存空间中构造GetTemp()里的临时对象,跳过了拷贝步骤,所以拷贝构造函数没有被调用,也就看不到对应的输出

验证方法

如果想要观察到拷贝构造函数的调用,可以禁用RVO优化,给g++添加编译选项-fno-elide-constructors:

g++ xxx.cc -fno-elide-constructors

运行编译后的程序,就能看到拷贝构造函数的输出了。

补充说明

RVO是C++标准明确允许的优化行为,哪怕你的类定义了自定义的拷贝/移动构造函数,编译器依然可以执行这个优化。它不属于编译器的bug,而是为了提升程序性能的标准特性。

内容的提问来源于stack exchange,提问作者shanfeng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:57:28