搬家类型很贵

时间:2017-11-12 13:49:55

标签: c++ rvo

我正在阅读正式的CPPCoreGuidelines以正确理解何时可靠地依靠RVO,何时不依赖RVO。 在F20,写道:

  

如果移动类型(例如阵列)很昂贵,请考虑   将它分配到免费商店并返回句柄(例如,   unique_ptr),或者在对非const目标对象的引用中传递它   填充(用作外部参数)

据我所知,非STL类型没有针对移动进行优化,但是如何轻松检测其他类型的移动昂贵,所以我不会在它们上使用RVO?

1 个答案:

答案 0 :(得分:16)

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

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

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

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

就昂贵的举动而言:当然,可能会有类型昂贵的移动 - 但我想不出任何移动比复制更强的实例。

因此:

  • 依赖于RVO,特别是在C ++ 17中 - 即使对于“移动费用昂贵”的类型,也不会产生任何费用。

  • 如果移动类型很昂贵,复制也很昂贵 - 所以你真的没有选择。重新设计代码,以便在可能的情况下不需要复制/移动。