gpt4 book ai didi

C++对象返回

转载 作者:可可西里 更新时间:2023-11-01 18:16:34 25 4
gpt4 key购买 nike

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

int main(){
TestObject a = getObject();
}

我说的对吗,在 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();
}

如果我运行它,析构函数只运行一次(不适用于 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();
}

按照 RVO 指南,此测试在 getanobject() 和 main 函数中的两个对象上运行析构函数。在这种情况下,我是否应该始终执行三规则以确保一致的行为?

最佳答案

If I run this the destructor is run just once (not for the local object in getAnObject()). Can I assume this will always be the case?

为了正确性?不,为了效率?是的。 -ish

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

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

但是,这种优化(称为“命名返回值优化”,NRVO)并没有得到标准的保证(事实上不可能在任何地方执行)。您不能假设它会发生正确性。特别是,您的对象仍然需要一个定义良好的复制构造函数和析构函数,否则程序格式错误

另一方面,您可以合理地期望所有现代编译器尽可能执行此优化。因此,您可以(通常)从性能的角度依赖此优化。

关于C++对象返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4400159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com