C++ 编译器会优化掉未使用的返回值吗?

Mar*_*cin 6 c++ compiler-construction gcc return visual-c++

如果我有一个返回对象的函数,但调用者从不使用这个返回值,编译器会优化掉副本吗?(可能总是/有时/从不回答。)

基本示例:

ReturnValue MyClass::FunctionThatAltersMembersAndNeverFails()
{
    //Do stuff to members of MyClass that never fails
    return successfulResultObject;
}

void MyClass::DoWork()
{
    // Do some stuff
    FunctionThatAltersMembersAndNeverFails();
    // Do more stuff
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,ReturnValue对象会被复制吗?它甚至被构建了吗?(我知道这可能取决于编译器,但让我们将讨论范围缩小到流行的现代讨论。)

编辑:让我们稍微简化一下,因为在一般情况下似乎没有达成共识。如果ReturnValue是一个 int,我们返回 0 而不是successfulResultObject呢?

Mar*_*wis 3

如果 ReturnValue 类具有重要的复制构造函数,则编译器不得消除对复制构造函数的调用 - 这是由调用它的语言强制执行的。

如果复制构造函数是内联的,则编译器可能能够内联该调用,这反过来可能会导致消除其大部分代码(也取决于 FunctionThatAltersMembersAndNeverFails 是否内联)。

  • 并非如此。在临时对象的特定情况下,编译器具有显式权限,可以在其目标中直接构造对象,而不是复制它(请参阅 ISO 14882 §12.2)。如果中间对象有名称,那么你就是对的。 (4认同)
  • “编译器不能消除对复制构造函数的调用” - 这个信息似乎是错误的,否则 [NRVO](http://en.wikipedia.org/wiki/NRVO) 是不可能的,不是吗? (2认同)