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

从函数返回对象时未调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:05:21