1

考虑以下代码片段:

list<someClass>& method();
....
list<someClass> test = method();

这将是什么行为?将这段代码:

  1. 从method()返回值优化返回的someClass实例的引用,然后对引用执行someClass的复制构造函数?

  2. 避免以某种方式调用复制构造函数?

具体来说,我有返回非常大的列表的方法,我想避免在每个返回值上调用复制构造函数。

编辑:Erm,对不起,代码现在编译......

4

4 回答 4

4

必须调用复制构造函数,因为这段代码必须进行复制:method()函数返回对某个对象的引用,该对象的副本必须存储在变量中test

由于您返回的是引用而不是对象,因此不需要返回值优化。

如果不想复制列表,可以test参考:

list<someClass>& test = method();

但是,test然后将引用原始列表,因此对原始列表所做的任何修改test也会对原始列表进行,并且每当原始列表被销毁时,test将变得无效(这意味着您必须更加小心对象的生命周期)。

于 2010-07-10T16:24:04.320 回答
1

存在 RVO。我不确定它是否适用于这里。无论如何,这是减少复制的一种方法。

http://en.wikipedia.org/wiki/Return_value_optimization

于 2010-07-10T16:38:47.763 回答
0

好吧,您不能将列表分配给 someClass(除非您重载了赋值运算符或复制构造函数,并使用返回的列表来复制构造)。如果您不这样做,则不应编译。

于 2010-07-10T16:24:38.993 回答
0

查看您的代码,很难通过返回对列表的引用然后对其进行复制来猜测您在此处尝试实现的目标。

如果可能,请考虑将迭代器返回到列表(或对迭代器的引用)的想法(假设列表不是函数本地的东西等)。

于 2010-07-10T16:37:48.843 回答