RVO何时应适用于/确实适用于C ++ 20编译器

Bér*_*ger 6 c++ compiler-optimization rvo c++20

C ++核心准则指出:

F.20:对于“输出”输出值,更喜欢返回值而不是输出参数

但是然后给出以下异常:

struct Package {      // exceptional case: expensive-to-move object
    char header[16];
    char load[2024 - 16];
};

Package fill();       // Bad: large return value
void fill(Package&);  // OK
Run Code Online (Sandbox Code Playgroud)

Isn't it supposed to be a case where the return value optimization kicks in ? Is RVO prevented in this case ? Or still not as efficient as passing by reference ? Or is it that some compilers don't manage to do it ?

More generally, when should I rely on the compiler optimizing return values as efficiently as the pass-by-reference technique ?

T.C*_*.C. 4

“普通”RVO(即返回纯右值或通俗说法中的“临时”)在 C++17 中得到保证,甚至在此之前就得到了良好的支持。

NRVO(即返回局部变量)可能很挑剔并且无法保证,如果不执行,那么您就会采取行动。如果你的搬家费用昂贵,你可能想避免这种情况。

在示例中,很有可能fill需要使用后者。