【问题标题】:C++ RVO: when it happens?C++ RVO:什么时候发生?
【发布时间】:2017-08-03 22:42:45
【问题描述】:

http://coliru.stacked-crooked.com/a/c795a5d2bb91ae32

#include <iostream>
struct X {
    X(const char *) { std::cout << 1; }
    X(const X &) { std::cout << 2; }
    X(X &&) { std::cout << 3; }
};
X f(X a) {
    return a;
}
X g(const char * b) {
    X c(b);
    return c;
}

int main() {
    f("hello"); // 13
    g("hello"); // 1
}

函数f(X a)最后一行有什么区别: return a; 而不是 return std::move(a);

函数f 没有RVO 但g 有NRVO 是真的吗?

【问题讨论】:

  • IIRC,使用 return std::move(a); 箔 RVO;真正的 RVO 既不涉及移动也不涉及复制构造函数,但 std::move(a) 表示需要构造,因为您违反了 NRVO 的规则。
  • Stephan T. Lavavej 在他的“不要帮助编译器”演讲中解释了这一点
  • 每个问题一个问题。

标签: c++ c++11 move-semantics rvo nrvo


【解决方案1】:

函数f(X a)的最后一行有什么区别:return a;而不是 return std::move(a);?

没有。 a 是函数的一个局部变量,所以return a 可以从中移动。

函数f 没有RVO 但g 有NRVO 是真的吗?

正确。命名省略永远不会应用于函数参数;它只适用于不是函数参数的局部变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2013-03-01
    • 2018-02-18
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多