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,提问作者一碗给力嗯
相关产品推荐
相关产品推荐

