搬家类型很贵

Taw*_*Taw 11 c++ rvo

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

如果移动类型(例如,数组)很昂贵,请考虑在免费存储上分配它并返回句柄(例如,unique_ptr),或者将其传递给非const目标对象以进行填充(用作out参数)

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

Vit*_*meo 16

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

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

void bar()
{
    auto v = foo(); // (0)
}
Run Code Online (Sandbox Code Playgroud)

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


在昂贵的举动方面:当然,可能会有类型昂贵的移动 - 但我想不出任何移动比副本更昂贵的情况.

因此:

  • 依靠RVO,特别是在C++ 17中 - 即使对于"移动昂贵"的类型,也不会产生任何成本.

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

  • F.20实际上是一个不好的建议吗?看来他们在这里不考虑RVO.他们为`Package fill();`说"Bad:large value",但由于RVO,它一点也不差...... (2认同)