C++对象返回

Gue*_*000 7 c++

TestObject getObject(){
    TestObject a(5.0f);
    return a;
}

int main(){
    TestObject a = getObject();
}
Run Code Online (Sandbox Code Playgroud)

我是否正确地说,在C++中,返回的对象不会在返回时调用析构函数.是否在不运行析构函数的情况下删除了函数调用中占用的内存?

好的具体例子..

#include <iostream>

class Test{
public:
 Test(){};
 ~Test(){std::cout << "Goodbye cruel world\n";}
};


Test getAnObject(){
 Test a;
 return a;
}

int main(){
 Test a = getAnObject();
}
Run Code Online (Sandbox Code Playgroud)

如果我运行它,析构函数只运行一次(不适用于getAnObject()中的本地对象).我能否一直认为这种情况总是如此?

#include <iostream>

class Test{
public:
 Test(){};
 ~Test(){std::cout << "Goodbye cruel world\n";}
};


Test getAnObject(){
 Test a;
 Test b;
 int i = 0;
 if (i){
  return a;
 }else{
  return b;
 }
}

int main(){
 Test a = getAnObject();
}
Run Code Online (Sandbox Code Playgroud)

遵循RVO指南,此测试在getanobject()和main函数中的两个对象上运行析构函数.这是一个我应该始终实施三条规则以确保一致行为的情况吗?

Kon*_*lph 9

如果我运行它,析构函数只运行一次(不适用于getAnObject()中的本地对象).我能否一直认为这种情况总是如此?

为了正确吗?不.为了效率?是.-.

详细说明:严格来说,从函数返回时将复制本地对象.然后通过调用本地对象的析构函数来清理本地存储.

但是,编译器可以自由地生成产生相同可观察行为的不同代码.特别是,该标准授予编译器忽略复制返回值的权利,并为两个对象(本地对象和返回值的接收对象)重用相同的存储位置.在这样做时,编译器可能不需要调用复制构造函数,也不需要调用析构函数(因为它重用了相同的内存位置).

然而,这种优化(称为"命名返回值优化",NRVO)不是由标准保证的(实际上它不可能在任何地方执行).你不能认为它会发生正确性.特别是,您的对象仍然需要一个定义良好的复制构造函数和析构函数,否则程序就会格式不正确.

另一方面,您可以合理地期望所有现代编译器在可能的情况下执行此优化.因此,您可以(通常)从性能的角度来看这种优化.


Lav*_*ven 5

它是基于实现的.它被称为返回值优化技术.查看此信息以获取更多信息:

http://en.wikipedia.org/wiki/Return_value_optimization