【发布时间】:2013-05-10 17:23:40
【问题描述】:
在研究编译器优化时,我简单地编译了以下代码:
#include<stdio.h>
struct fraction {
int num ;
int denum ;
};
int main()
{
struct fraction pi;
pi.num = 22;
pi.denum = 7;
return 0;
}
使用
gcc test.c -o test
当我拆开这个时,我得到:
push %ebp
mov %esp,%ebp
sub $0x10,%esp
movl $0x16,-0x8(%ebp)
movl $0x7,-0x4(%ebp)
mov $0x0,%eax
leave
ret
但如果我应用如下优化:
gcc test.c -o test -O3
我在反汇编中得到的只是:
push %ebp
xor %eax,%eax
mov %esp,%ebp
pop %ebp
ret
如果没有优化,值 22 和 7 在反汇编中清晰可见,我可以清楚地理解代码是如何工作的,但是优化后这些值现在在哪里?代码现在如何工作?请有人解释一下。
【问题讨论】:
-
代码基本上什么都不做,编译器知道这一点。
-
“denum”是指“denum”吗? “有”是指“没有”吗?我知道已经很晚了,但是在谈论编译器优化时注意细节有点重要......
-
你的程序什么也没做;优化器发现了这一点并将其更改为什么都不做(但返回 0)的程序
-
明白,谢谢@antlersoft
标签: c linux compiler-construction disassembly