【发布时间】:2017-03-01 21:55:33
【问题描述】:
假设我有以下 C 代码: #包括
int main()
{
int x = 11;
int y = x + 3;
printf("%d\n", x);
return 0;
}
然后我使用 gcc 将它编译成 asm,我得到了这个(去掉了一些标志):
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $11, -4(%rbp)
movl -4(%rbp), %eax
addl $3, %eax
movl %eax, -8(%rbp)
movl -4(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
ret
我的问题是为什么它是movl -4(%rbp), %eax 后跟movl %eax, %esi,而不是简单的movl -4(%rbp), %esi(根据我的实验效果很好)?
【问题讨论】:
-
你启用优化了吗?
-
This is your code with
-Os选项...尝试将其更改为-O0看看会发生什么 -
@MarcGlisse 不,我没有。
-
嗯,太棒了。通过优化,结果是巨大的。
-
gcc 做了两件事:从内存中读取 x,并将其存储在 ABI 规定的函数调用位置。如果没有优化,它不会尝试合并这两个步骤。