如何为 Visual Studio 中的聚合激活 (N)RVO?
How to activate (N)RVO for aggregates in Visual Studio?
Visual C++ 是否真的支持(命名)return 聚合的值优化 (N)RVO?
在例子中如下:
struct Vector
{
float data[100];
};
void print(const Vector & v);
inline Vector makeVector()
{
Vector c;
return c;
}
void foo()
{
print(makeVector());
}
编译优化(/O2 开关)
https://godbolt.org/g/bb8HZj
可以很容易地看到在 makeVector() 函数
中构造了 Vector 的副本
lea rcx, QWORD PTR [rcx+128]
movups xmm0, XMMWORD PTR [rax]
lea rax, QWORD PTR [rax+128]
movups XMMWORD PTR [rcx-128], xmm0
movups xmm1, XMMWORD PTR [rax-112]
movups XMMWORD PTR [rcx-112], xmm1
movups xmm0, XMMWORD PTR [rax-96]
movups XMMWORD PTR [rcx-96], xmm0
...
很明显这里没有像其他编译器那样的 NRVO。有没有办法在 Visual C++ 中打开或激活它?
看起来 MSVC 没有将 RVO 应用于被视为 C 结构的类型。解决方案是让你的 Vector
看起来像 C++ 类型(让它成为非 POD,但我不确定 POD 是否是 MSVC 在这里使用的)。试试这个:
struct Vector
{
Vector() { }
float data[100];
};
小心,因为它会改变语义:您将无法使用 Vector v{}
.
对其进行零初始化
Visual C++ 是否真的支持(命名)return 聚合的值优化 (N)RVO?
在例子中如下:
struct Vector
{
float data[100];
};
void print(const Vector & v);
inline Vector makeVector()
{
Vector c;
return c;
}
void foo()
{
print(makeVector());
}
编译优化(/O2 开关) https://godbolt.org/g/bb8HZj 可以很容易地看到在 makeVector() 函数
中构造了 Vector 的副本 lea rcx, QWORD PTR [rcx+128]
movups xmm0, XMMWORD PTR [rax]
lea rax, QWORD PTR [rax+128]
movups XMMWORD PTR [rcx-128], xmm0
movups xmm1, XMMWORD PTR [rax-112]
movups XMMWORD PTR [rcx-112], xmm1
movups xmm0, XMMWORD PTR [rax-96]
movups XMMWORD PTR [rcx-96], xmm0
...
很明显这里没有像其他编译器那样的 NRVO。有没有办法在 Visual C++ 中打开或激活它?
看起来 MSVC 没有将 RVO 应用于被视为 C 结构的类型。解决方案是让你的 Vector
看起来像 C++ 类型(让它成为非 POD,但我不确定 POD 是否是 MSVC 在这里使用的)。试试这个:
struct Vector
{
Vector() { }
float data[100];
};
小心,因为它会改变语义:您将无法使用 Vector v{}
.