如何为 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{}.

对其进行零初始化