如何在C ++中“返回一个对象”?
我知道标题听起来很熟悉,因为有很多类似的问题,但我要求的是问题的不同方面(我知道在堆栈中放置事物并将其放在堆上的区别)。
在Java中,我总是可以返回对“本地”对象的引用
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
在C ++中,为了做类似的事情,我有两个选项
(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;
,这看起来不太好。 我不想返回复制的值,因为效率不高(我认为),所以在这里提出问题
我不想返回复制的值,因为效率不高
证明给我看。
查找RVO和NRVO,以及C ++ 0x移动语义。 在大多数情况下,在C ++ 03中,out参数只是让你的代码变得丑陋的一种好方法,而在C ++ 0x中,你实际上会使用out参数伤害自己。
只需编写干净的代码,按价值返回。 如果性能是一个问题,请将其归档(不要猜测),并找到可以解决的方法。 它可能不会从函数中返回。
也就是说,如果你死定了这样的写作,你可能会想要做出out参数。 它避免了动态内存分配,这是更安全和通常更快。 它确实需要你在调用函数之前有一些方法来构造对象,这对于所有对象并不总是有意义的。
如果你想使用动态分配,至少可以做到的是把它放在一个智能指针。 (无论如何都应该始终这样做)然后你不必担心删除任何东西,事情是异常安全的等等。唯一的问题是它可能比按值返回更慢!
只需创建对象并将其返回
Thing calculateThing() {
Thing thing;
// do calculations and modify thing
return thing;
}
我认为如果你忘记了优化并编写了可读代码(你需要稍后运行一个分析器 - 但不要预先优化),那么你会为自己做一个忙。
只需返回一个像这样的对象:
Thing calculateThing()
{
Thing thing();
// do calculations and modify thing
return thing;
}
这将调用Things上的拷贝构造函数,所以你可能想要自己实现它。 喜欢这个:
Thing(const Thing& aThing) {}
这可能会慢一点,但它可能不是问题。
更新
编译器可能会优化对拷贝构造函数的调用,所以不会有额外的开销。 (就像评论中指出的dreamlax一样)。
链接地址: http://www.djcxy.com/p/72973.html