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 ?
“普通”RVO(即返回纯右值或通俗说法中的“临时”)在 C++17 中得到保证,甚至在此之前就得到了良好的支持。
NRVO(即返回局部变量)可能很挑剔并且无法保证,如果不执行,那么您就会采取行动。如果你的搬家费用昂贵,你可能想避免这种情况。
在示例中,很有可能fill需要使用后者。