【问题标题】:NRV(named return value) copy-constructorNRV(命名返回值)复制构造函数
【发布时间】:2013-10-10 09:29:55
【问题描述】:

最近,我在阅读“c++ 的对象模型内部”,在阅读第 5 章时,我想到了以下问题:

即使类具有复制构造函数,编译器也会处理 NRVO 吗?

【问题讨论】:

  • 简而言之,您是在询问是否存在非平凡的复制构造函数(即可能具有副作用的构造函数)可以禁止编译器执行 NRVO(删除复制)?
  • 是的,我不确定答案

标签: c++ compiler-construction copy-constructor return-value-optimization nrvo


【解决方案1】:

答案是“不,它不会阻止它。”

n3290(C++11 草案),12 卷书,第 8 章,第 31 节 (p284):

当满足某些条件时,允许实现省略类的复制/移动构造 对象,即使对象的复制/移动构造函数和/或析构函数有副作用。

【讨论】:

    【解决方案2】:

    RVO(或 NRVO)是编译器可能用来删除副本的优化,即防止创建冗余副本。您的复制构造函数的自定义实现无法阻止应用此优化。

    【讨论】:

      【解决方案3】:

      RVO 或多或少是在另一个范围内创建对象,并在读取或写入变量时使用该对象而不是本地对象。这会导致只创建一个对象,而根本不会调用任何复制 ctor,从而呈现您是否已将其声明为无关紧要。

      【讨论】:

        【解决方案4】:

        我认为你的问题是“如果简单的复制构造函数会阻止 nrvo”, 我的回答是否定的。 我用了《c++对象模型内部》一书中的案例,让它打印出foo函数和main函数中的成员地址,结果显示在release模式下是一样的,在debug模式下是不同的乐观,在 vs2010 中。 这意味着 NRVO 不关心你是否有一个非平凡的复制构造函数或一个平凡的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-07
          • 2016-10-06
          • 1970-01-01
          • 1970-01-01
          • 2013-07-20
          相关资源
          最近更新 更多