能否在调试版本中关闭 NRVO?
Can NRVO be turned off in debug builds?
程序中如下
#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?
因为 mandatory copy elision 在这里不适用,是的,编译器没有义务优化任何构建中的移动,无论是调试还是优化。
允许,但不是必需的。
程序中如下
#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?
因为 mandatory copy elision 在这里不适用,是的,编译器没有义务优化任何构建中的移动,无论是调试还是优化。
允许,但不是必需的。