【问题标题】:Does such an optimization exist in g++?g++中是否存在这样的优化?
【发布时间】:2010-07-10 16:21:15
【问题描述】:

考虑以下代码sn-p:

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

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

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

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

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

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

【问题讨论】:

  • 嗯?那甚至不会编译。没有从std::list&lt;t&gt; 到t 的隐式转换。如果您关心性能,则无论如何都应该使用vector 或deque 而不是列表。
  • 与任何关于优化的问题一样,唯一真正的答案是检查您的特定代码的汇编器输出。
  • 你的意思是`method().front()? You will also have to make sure that the list object to which the returned list reference points to stays alive after the execution of method()`.
  • @Billy :因为他没有给出someClass 的定义,所以无法判断这是否会编译。如果你不知道他将如何使用它,那么知道他的数据结构不是最理想的有点冒昧:)
  • struct someClass { someClass(std::list&lt;someClass&gt;&amp;); };?

标签: c++ stl copy-constructor


【解决方案1】:

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

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

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

list<someClass>& test = method();

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-27
          • 2023-03-31
          • 1970-01-01
          • 2010-12-03
          • 2012-01-18
          • 1970-01-01
          相关资源
          最近更新 更多