g ++中是否存在这样的优化?

时间:2010-07-10 16:21:15

标签: c++ stl copy-constructor

请考虑以下代码段:

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

这会是什么行为?请问这段代码:

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

如果您不想复制该列表,可以将test作为参考:

list<someClass>& test = method();

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

答案 1 :(得分:1)

存在RVO。我不确定它是否适用于此。无论如何,这是最小化复制的一种方法。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

查看您的代码,通过将引用返回到列表然后复制它,很难猜测您要在此处实现的目标。

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