Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么MSVC在寄存器中返回一个小结构时不必要地使用堆栈?_C++_Visual Studio_Visual C++_Optimization_Assembly - Fatal编程技术网

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

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以返回 我原以

我在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
以返回

我原以为:

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团队。