【问题标题】:Does RVO optimisation happens when a copy constructor is not defined for a class?当没有为类定义复制构造函数时,是否会发生 RVO 优化?
【发布时间】:2014-02-17 09:02:25
【问题描述】:

假设我有这段代码:

class Base {
public:
    void f() {}
private:
    int n;
};

Base foo()
{
    Base b;

    // processing

    return b;
}

Base 没有定义复制构造函数,并且查看其成员编译器不会合成一个。
此代码是否应用了命名返回值 (NRV) 优化?编译器应用 NRV 的确切规则是什么?

【问题讨论】:

  • 为什么你认为编译器不会为那个类合成一个复制构造函数?
  • 因为它只执行成员明智的复制。如果我错了,请纠正。
  • 执行成员方式的复制是编译器合成的复制构造函数所做的

标签: c++ rvo


【解决方案1】:

首先,没有确切的规则,因为 NRVO 不是标准的明确部分,而是标准的其他部分允许的。编译器永远不需要使用 NRVO,不同的编译器会被不同的构造禁止使用 NRVO。

在您的情况下,没有明显的限制使用 NRVO。没有显式析构函数或复制构造函数,并且返回的变量在任何条件或循环块之外声明。不过,这取决于// processing 区域的情况。

【讨论】:

  • 作为我在Linux环境下对g++/clang++的实验,如果类中没有copy ctor,NRVO是不会实现的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多