gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:30:49 24 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

证明它。

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

只需编写干净的代码,按值返回。如果性能是一个问题,请对其进行分析(停止猜测),然后找出可以解决的方法。它可能不会从函数返回东西。


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

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

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

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