关于返回值优化的C++问题

Gra*_*ity 12 c++

在这个网站上有很多关于返回值优化的问题(我认为这是一个相当令人困惑的话题),但我似乎无法找到一个回答我特定问题的问题.如果我有这样的代码:

returnType function() { stuff....}

void someOtherFunction()
{
    returnType var = function();
    more stuff...
}
Run Code Online (Sandbox Code Playgroud)

我被告知编译器可能决定不使用returnTypein的两个实例someOtherFunction().从逻辑上讲,我希望function()生成一个类型的对象returnType,并someOtherFunction()通过复制构造函数(重载或不重载)将该值接收到临时值.然后我希望通过赋值(可以重载并且理论上可以具有任何类型的功能!)来复制临时值,这可以var通过默认构造函数进行初始化.

我在这看到一个潜在的问题.如果没有这个临时副本会发生什么returnTypesomeOtherFunction()?是不是var必须通过复制构造函数function()直接用返回的值填充?如果是这样,不会调用赋值运算符吗?如果是这样,并且如果赋值运算符过载,那么这不能改变程序的功能吗?如果是这样,这是否意味着程序员有责任确保=始终与复制构造函数做同样的事情?我讨厌运行这一长串问题,但如果是这样,为什么C++允许您定义复制构造函数来执行除赋值之外的其他操作?

Pup*_*ppy 8

然后我希望通过赋值(可以重载并且理论上可以具有任何类型的功能!)将临时值复制到var中,这可以通过默认构造函数进行初始化.

嗯,首先,这是非常错误的.

int x = 0;
int x(0);
Run Code Online (Sandbox Code Playgroud)

这两行是相同的 - 构造函数调用.存在一些差异 - 我认为第一个不能调用显式构造函数 - 但它们是相同的函数调用.没有默认构造,也没有赋值操作符调用.它们都是直接结构.

基本上,标准说"如果你做的不是在复制构造函数中复制一个对象,那就是你自己的愚蠢错误,我笑了,因为你的程序在优化器消除调用时没有表现出预期的行为".当然,这些是我自己的释义词,但标准对于优化器被允许消除副本非常明确.在C++ 0x中,这也适用于移动.

你上面的代码片段确实如此

returnType function() { stuff....}

void someOtherFunction()
{
    returnType var(function());
    more stuff...
}
Run Code Online (Sandbox Code Playgroud)

这不是优化版本,它就是它的真实含义.永远不会调用赋值运算符.而对于NRVO,它看起来像

void function(void* mem) { // construct return value into mem
    new (mem) returnType;
    // Do shiz with returnType;
}
void someOtherFunction() {
    // This doesn't respect some other things like alignment
    // but it's the basic idea
    char someMemory[sizeof(returnType)];
    function(someMemory);
    // more stuff here
}
Run Code Online (Sandbox Code Playgroud)

当然,编译器还必须处理破坏对象,即使在异常的情况下,并确保所有别名都是正确的类型,对齐,以及我在我的示例中没有处理的其他一些事情,但是希望你得到一般的要点.

  • `T var = something`要求T具有非显式构造函数以及可见复制构造函数. (4认同)