从函数返回对象时未调用Copy Constructor的原因咨询
拷贝构造函数未被调用的原因分析
现象
拷贝构造函数未被调用,程序运行后无任何输出。
示例代码
#include <iostream> using namespace std; class Sample { int x; int y; public: Sample(int a, int b) { x = a, y = b; } Sample(Sample &S) { cout << "Copy Constructor Invoked" << endl; x = S.x; y = S.y; } }; Sample fun(int a, int b) { Sample temp(a, b); return temp; } int main() { Sample S = fun(1, 2); }
问题
从函数fun返回对象时,按逻辑应该创建对象副本并调用拷贝构造函数,但实际未触发调用,程序输出为空,这是什么原因?
原因解释
这是因为编译器启用了返回值优化(RVO,Return Value Optimization)。
按照常规逻辑,函数fun里创建的temp对象需要先拷贝到函数返回的临时对象,再拷贝到main里的S对象,理论上会触发两次拷贝构造函数调用。但编译器会直接优化这个过程:它会在main函数中S对象的内存位置直接构造fun里的temp对象,完全跳过了中间的拷贝步骤,所以拷贝构造函数不会被调用,自然看不到输出。
这种优化是C++标准明确允许的,哪怕拷贝构造函数包含诸如打印日志这类副作用,编译器依然可以执行该优化。如果需要验证拷贝构造函数的逻辑,可以通过编译器选项禁用该优化,比如在GCC或Clang中添加-fno-elide-constructors参数,此时就能看到拷贝构造函数被调用的输出了。
内容的提问来源于stack exchange,提问作者surya
相关产品推荐
相关产品推荐

