0

在研究编译器优化时,我简单地编译了以下代码:

#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 在反汇编中清晰可见,我可以清楚地理解代码是如何工作的,但是优化后这些值现在在哪里?代码现在如何工作?请有人解释。

4

2 回答 2

12

由于您的代码没有有效地执行任何会产生不可预测的副作用的外部可见操作,因此完全消除了结构的创建,现在您的代码所做的只是从main().

(如果你告诉编译器它确实需要创建结构,因为它可能被某人/其他东西修改,它不会摆脱代码。将你的变量声明为volatile,你会在汇编器中看到它。 )

于 2013-05-10T17:27:08.377 回答
4

编译器确定它pi从未在该范围之外使用,并且由于没有副作用,因此优化了整个变量以及赋值。

生成的汇编代码几乎加载0eax中,摆弄堆栈指针,然后返回。

于 2013-05-10T17:28:35.887 回答