【发布时间】:2018-07-20 23:09:57
【问题描述】:
Visual C++ 是否支持(命名的)聚合返回值优化 (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++ 中打开或激活它?
【问题讨论】:
标签: c++ visual-studio return-value-optimization