优化后代码如何工作?

Moj*_*ojo 0 c linux compiler-construction disassembly

在研究编译器优化时,我只是编写了以下代码:

#include<stdio.h>
struct fraction {
    int num ;
    int denum ;
};

int main()
{
  struct fraction pi;
  pi.num = 22;
  pi.denum = 7;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

运用

gcc test.c -o test
Run Code Online (Sandbox Code Playgroud)

当我拆卸它时,我得到:

push   %ebp
mov    %esp,%ebp
sub    $0x10,%esp
movl   $0x16,-0x8(%ebp)
movl   $0x7,-0x4(%ebp)
mov    $0x0,%eax
leave  
ret 
Run Code Online (Sandbox Code Playgroud)

但是,如果我应用优化,如:

gcc test.c -o test -O3
Run Code Online (Sandbox Code Playgroud)

我所有的反汇编是:

push   %ebp
xor    %eax,%eax
mov    %esp,%ebp
pop    %ebp
ret 
Run Code Online (Sandbox Code Playgroud)

如果没有优化,值22和7在反汇编中清晰可见,我可以清楚地理解代码是如何工作的,但现在优化后的值是在哪里?代码现在如何工作?请有人解释一下.

小智 12

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

(如果你告诉编译器它确实需要创建结构,因为它可能被别人/别人修改,它将不会删除代码.声明你的变量volatile,你会在汇编器中看到它. )