考虑以下返回大对象的函数:
std::list<SomethingBig> DoSomething()
{
std::list<SomethingBig> TheList;
//do stuff
return TheList;
}
我想得到清单,而不是它的副本。因为如果我必须复制这样的对象,性能代价是昂贵的。我知道返回值优化可能会为我解决这个问题,但是依靠优化来优化坏代码并不是最好的方法(对吧?)。
避免复制和延长对象寿命的一种干净方法是使用常量引用(请在将其称为悬空引用之前对其进行测试,因为它不是):
const std::list<SomethingBig>& theList = DoSomething();
在 C++11 中,可以std::move
用来避免复制。但是,我正在开发一个 C++03 程序,我必须这样做:
const std::list<SomethingBig>& list1 = DoSomething();
const std::list<SomethingBig>& list2 = DoSomethingElse();
现在我需要将列表拼接在一起。我这样做的唯一方法是复制所有内容,或者const_cast
这些列表并将它们拼接起来。有更好的解决方案吗?