12

我正在阅读官方的 CPPCoreGuidelines 以正确理解什么时候依靠 RVO 可靠,什么时候不可靠。在 F20 处写着:

如果一个类型的移动成本很高(例如,数组),请考虑将其分配到空闲存储区并返回一个句柄(例如,unique_ptr),或者将其传递给非常量目标对象的引用以进行填充(用作外参数)

我知道非 STL 类型没有针对移动进行优化,但是我怎样才能轻松检测到移动成本高昂的其他类型,所以我不会在它们上使用 RVO?

4

1 回答 1

16

您似乎误解了“RVO”是什么。“RVO”代表“返回值优化”,它是一种编译器优化,可防止调用任何移动或复制构造函数。例如

std::vector<huge_thing> foo()
{
    std::vector<huge_thing> result{/* ... */};
    return result;
}

void bar()
{
    auto v = foo(); // (0)
}

任何体面的编译器都不会执行任何复制/移动操作,而是简单v地在(0)处构造。在 C++17 中,由于对prvalues的更改,这是强制性的。


就昂贵的移动而言:当然,可能存在移动昂贵的类型 - 但我想不出任何移动比副本更昂贵的实例。

所以:

  • 依赖 RVO,尤其是在 C++17 中 - 即使对于“移动昂贵”的类型,这也不会产生任何成本。

  • 如果一种类型的移动成本很高,那么复制也很昂贵——所以你真的别无选择。重新设计您的代码,以便尽可能不需要复制/移动。

于 2017-11-12T13:54:04.497 回答