【发布时间】:2015-03-17 20:36:44
【问题描述】:
我在 MSVC 2013, x64, Release build with /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
【问题讨论】:
-
哇,这是一个我不知道的非常有用的工具。谢谢!
-
这个函数总是被内联的。查看未优化的代码是没有用的。
-
@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
标签: c++ visual-studio visual-c++ optimization assembly