c++ - 可以在调试版本中关闭 NRVO 吗?
问题描述
在程序中如下
#include <iostream>
struct A
{
A() { std::cout << "0"; }
A( const A & ) { std::cout << "1"; }
A( A && ) noexcept { std::cout << "2"; }
};
A foo()
{
A res;
return res;
}
int main()
{
const A a = foo();
(void)a;
}
我希望命名返回值优化发生在 foo() 中,因此不会调用复制或移动构造函数。确实 gcc 和 clang 打印“0”。
但是调试配置中的 Visual Studio 2019 打印“02”。是否允许编译器在调试版本中避免使用 NRVO?
解决方案
由于强制复制省略在这里不适用,是的,编译器没有义务优化任何构建中的移动,无论是调试还是优化。
这是允许的,但不是必需的。
推荐阅读
- c++ - C++ 字符串计算器
- c++ - 查找对方包时的cmake包配置
- python - 最快的应用函数来更新 Python 中特定列的整行
- android - 无法从其他 Android 库中使用数据绑定
- django - 如何在我的 python django 服务器中使用全局/模块级别的 ThreadPoolExecutor?
- ios - iOS MFMessageComposeViewController 打开苹果商务聊天
- kubernetes - Istio - 将请求重定向到外部 url
- javascript - 使用 Object.defineProperty() 方法将 getter 和 setter 添加到现有对象时出错
- uwp-xaml - 文本框控件 UWP 中的文本修剪
- javascript - 使用 fetch 结果作为函数参数