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函数中的两个对象上运行析构函数.这是一个我应该始终实施三条规则以确保一致行为的情况吗?
如果我运行它,析构函数只运行一次(不适用于getAnObject()中的本地对象).我能否一直认为这种情况总是如此?
为了正确吗?不.为了效率?是.-.
详细说明:严格来说,从函数返回时将复制本地对象.然后通过调用本地对象的析构函数来清理本地存储.
但是,编译器可以自由地生成产生相同可观察行为的不同代码.特别是,该标准授予编译器忽略复制返回值的权利,并为两个对象(本地对象和返回值的接收对象)重用相同的存储位置.在这样做时,编译器可能不需要调用复制构造函数,也不需要调用析构函数(因为它重用了相同的内存位置).
然而,这种优化(称为"命名返回值优化",NRVO)不是由标准保证的(实际上它不可能在任何地方执行).你不能认为它会发生正确性.特别是,您的对象仍然需要一个定义良好的复制构造函数和析构函数,否则程序就会格式不正确.
另一方面,您可以合理地期望所有现代编译器在可能的情况下执行此优化.因此,您可以(通常)从性能的角度来看这种优化.
| 归档时间: |
|
| 查看次数: |
4902 次 |
| 最近记录: |