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呢?
如果 ReturnValue 类具有重要的复制构造函数,则编译器不得消除对复制构造函数的调用 - 这是由调用它的语言强制执行的。
如果复制构造函数是内联的,则编译器可能能够内联该调用,这反过来可能会导致消除其大部分代码(也取决于 FunctionThatAltersMembersAndNeverFails 是否内联)。