C++我可以期望所有编译器都不会销毁返回的副本

C++ can I expect all compilers to not destroy the copy being returned?

本文关键字:返回 副本 期望 我可以 编译器 C++      更新时间:2023-10-16
#include <iostream>
using namespace std;
class ClassA {
    int k;
public:
    ClassA(int i) : k(i) 
    {
    }
    ~ClassA()
    {
        cout << "A destroyed" << " k=" << k << endl;
    }
    ClassA copyAndModify() 
    { 
        ClassA a(k*2);
        return a; 
    }
    void taunt() 
    {
        cout << k << endl;
    }
};
int main (int argc, char * const argv[]) {
    ClassA original(1)
    ClassA modified = original.copyAndModify();
    modified.taunt();
    return 0;
}

我认为对象"a"(方法copyAndModify内部)在方法返回时被解构了,但事实并非如此。这是否意味着在方法中创建的返回的所有对象都不会被解构?所有编译器都是如此吗?

您遇到了返回值优化。 不,它不会在所有编译器上都相同。

这取决于编译器,但通常当方法按值返回对象实例时,编译器可以使用 RVO(返回值优化)通过将目标对象作为隐藏的引用参数传递来防止创建临时对象。换句话说,编译器会调整生成的代码,使其像您编写代码一样,如下所示:

void copyAndModify(ClassA &result)
{  
    ClassA a(k*2); 
    result = a;  
} 
ClassA modified;
original.copyAndModify(modified); 

在VS的情况下,如果您在调试模式下构建,则不会进行任何优化(对象将被销毁),但在发布模式下,优化会启动(对象不会被销毁)。

错。 如果它被退回,它不会被销毁。 这是有道理的。 返回已销毁的对象是没有意义的。