为什么MSVC在寄存器中返回一个小结构时不必要地使用堆栈?

jap*_*iss 12 c++ optimization assembly visual-studio visual-c++

我在MSVC 2013,x64,使用/ 02的发布版本上编译了以下代码:

struct Point
{
    int x;
    int y;
};

Point xUnit()
{
    Point p;
    p.x = 1;
    p.y = 0;
    return p;
}
Run Code Online (Sandbox Code Playgroud)

生成的汇编代码为xUnit():

mov QWORD PTR p$[rsp], 1
mov rax, QWORD PTR p$[rsp]
ret 0
Run Code Online (Sandbox Code Playgroud)

为什么它写入堆栈然后立即读回来rax返回?

我原以为:

mov rax, 1
ret 0
Run Code Online (Sandbox Code Playgroud)

vek*_*roc 3

X86 版本似乎做得很好(即生成“mov eax,1”)。

我的猜测是,X86 和 X64 版本是独立的代码库,在一个目标中发现的优化不一定存在于另一个目标中。

  • OP 询问为什么特定的编译器不执行特定的优化。我测试了针对不同目标(X86)具有相同标志的同一程序的编译器输出,它确实优化了代码。由于 MSVC 不是公共域编译器,因此很难说出原因 - 人们可以推测或直接询问 MSVC 团队。 (2认同)