为何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
相关产品推荐
相关产品推荐

