C++ 为什么MSVC在寄存器中返回一个小结构时不必要地使用堆栈?
我在MSVC 2013、x64和/02发布版本上编译了以下代码:C++ 为什么MSVC在寄存器中返回一个小结构时不必要地使用堆栈?,c++,visual-studio,visual-c++,optimization,assembly,C++,Visual Studio,Visual C++,Optimization,Assembly,我在MSVC 2013、x64和/02发布版本上编译了以下代码: struct Point { int x; int y; }; Point xUnit() { Point p; p.x = 1; p.y = 0; return p; } 为xUnit()生成的程序集代码为: mov QWORD PTR p$[rsp], 1 mov rax, QWORD PTR p$[rsp] ret 0 为什么它会写入堆栈,然后立即读回rax以返回 我原以
struct Point
{
int x;
int y;
};
Point xUnit()
{
Point p;
p.x = 1;
p.y = 0;
return p;
}
为xUnit()
生成的程序集代码为:
mov QWORD PTR p$[rsp], 1
mov rax, QWORD PTR p$[rsp]
ret 0
为什么它会写入堆栈,然后立即读回rax
以返回
我原以为:
mov rax, 1
ret 0
X86版本似乎做得很好(即生成“moveax,1”)
我的猜测是X86和X64版本是独立的代码基础,在一个目标中发现的优化不一定存在于另一个目标中。您所期望的基本上是在gcc.godbolt.org.Wow上生成的,这是一个我不知道的非常有用的工具。谢谢此函数将始终是内联的。查看未优化的代码是没有用的。@HansPassant他说他是用/O2编译的,所以我想在这种特殊情况下MSVC有点问题。意识到
mov-rax,1
还将Point
的x
字段设置为0是一个非常棒的优化。很容易弄错并将x
保留为非斜体。顺便说一句,我在Compiler Explorer(由@Columbo提供的链接)上检查的所有gcc版本基本上与MSVC相同:xUnit():pushq%rbp movq%rsp,%rbp movl$1,-16(%rbp)movl$0,-12(%rbp)movq-16(%rbp),%rax popq%rbp ret
这并没有提供问题的答案。若要评论或要求作者澄清,请在他们的帖子下方留下评论-你可以随时在自己的帖子上发表评论,一旦你有足够的评论,你就可以发表评论了。OP是问为什么某个特定的优化不是由某个特定的编译器完成的。我用不同目标(X86)的相同标志测试了同一程序的编译器输出,它确实优化了代码。因为MSVC不是一个公共域编译器,所以很难说为什么——可以推测或者直接询问MSVC团队。