gpt4 book ai didi

c++ - 如何在 C++ 中使用 "return an object"?

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:29 25 4
gpt4 key购买 nike

我知道这个标题听起来很熟悉,因为有很多类似的问题,但我要问的是问题的不同方面(我知道将东西放在堆栈上和将它们放在堆上之间的区别)。

在 Java 中,我总是可以返回对“本地”对象的引用

public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}

在 C++ 中,做类似的事情我有 2 个选择

(1) 只要我需要“返回”一个对象,我就可以使用引用

void calculateThing(Thing& thing) {
// do calculations and modify thing
}

然后像这样使用它

Thing thing;
calculateThing(thing);

(2) 或者我可以返回一个指向动态分配对象的指针

Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}

然后像这样使用它

Thing* thing = calculateThing();
delete thing;

使用第一种方法我不必手动释放内存,但对我来说这会使代码难以阅读。第二种方法的问题是,我必须记住 delete thing;,这看起来不太好。我不想返回复制的值,因为它效率低下(我认为),所以问题来了

  • 是否有第三种解决方案(不需要复制值)?
  • 如果我坚持第一个解决方案,会有什么问题吗?
  • 何时以及为何应使用第二种解决方案?

最佳答案

I don't want to return a copied value because it's inefficient

证明它。

查找 RVO 和 NRVO,以及 C++0x 中的移动语义。在 C++03 中的大多数情况下,out 参数只是让代码变得丑陋的好方法,而在 C++0x 中,使用 out 参数实际上会伤害到自己。

只需编写干净的代码,按值返回。如果性能是一个问题,分析它(停止猜测),然后找到你可以做些什么来解决它。它可能不会从函数返回东西。


就是说,如果您执意要这样写,您可能想要执行 out 参数。它避免了动态内存分配,后者更安​​全且通常更快。它确实要求您在调用函数之前有一些方法来构造对象,这并不总是对所有对象都有意义。

如果你想使用动态分配,至少可以做的是把它放在一个智能指针中。 (无论如何都应该一直这样做)然后你不用担心删除任何东西,事情是异常安全的,等等。唯一的问题是它可能比按值返回慢!

关于c++ - 如何在 C++ 中使用 "return an object"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44858788/

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