RVO 何时保证应用/确实适用于 C++20 编译器
When is RVO garanteed to apply / does apply with C++20 compilers
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
难道不应该是返回值优化启动的情况吗?在这种情况下可以防止RVO吗?还是不如通过引用传递有效?还是某些编译器无法做到这一点?
更一般地说,我什么时候应该依赖编译器像按引用传递技术一样有效地优化返回值?
">
普通"RVO(即,在通俗的说法中返回prvalue或"临时"(在C++17中得到保证,并且在此之前得到了很好的支持。
NRVO(即返回局部变量(可能很挑剔并且不能保证,如果不执行,那么您将获得移动。如果您的搬家很昂贵,您可能希望避免这种情况。
在此示例中,fill
很有可能需要使用后者。
还是仍然不如通过引用传递有效?
如果 RVO 适用,则返回值的效率与使用输出引用的效率相同。
在这种情况下,是否可以阻止RVO?
不。"大"不会阻止对象被 RVO'd。
RVO 何时保证应用/是否适用于 C++20 编译器
不适用的情况:
。return 语句可能涉及调用构造函数来执行操作数的复制或移动(如果它不是 prvalue,或者其类型与函数的返回类型不同(。
因此,是否保证复制省略取决于函数的实现。
准则确实没有解释为什么应该遵循这项建议。
请注意,异常显示:
异常
如果一个类型的移动成本很高(例如,
array<BigPOD>
(,请考虑将其分配给免费存储并返回一个句柄(例如,unique_ptr(,或者将其传递给要填充的非常量目标对象(用作 out-parameter(。
例外中突出显示的建议对我来说更有意义。它清楚地表明对象对于堆栈来说太大,从而减少了堆栈溢出的机会。
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 使用一个参数的模板函数时出错(适用于 2)
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 为什么这适用于 G++ 而不是 CLANG?
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 适用于 Linux 的 c++ 上的代理脚本
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 模板函数仅适用于VS
- 如何在cmake中包含适用于g++或viceversa的库
- 适用于win32、linux、mac的POSIX C包装器
- WinDBG适用于从Visual Studio 2015保存的转储,但不适用于任务管理器。显示异常代码"not found"
- RVO 何时保证应用/确实适用于 C++20 编译器