首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化后的代码是如何工作的?

优化后的代码是如何工作的?
EN

Stack Overflow用户
提问于 2013-05-11 01:23:41
回答 2查看 101关注 0票数 0

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

代码语言:javascript
复制
#include<stdio.h>
struct fraction {
    int num ;
    int denum ;
};

int main()
{
  struct fraction pi;
  pi.num = 22;
  pi.denum = 7;
  return 0;
}

使用

代码语言:javascript
复制
gcc test.c -o test

当我拆卸这个代码时,我得到:

代码语言:javascript
复制
push   %ebp
mov    %esp,%ebp
sub    $0x10,%esp
movl   $0x16,-0x8(%ebp)
movl   $0x7,-0x4(%ebp)
mov    $0x0,%eax
leave  
ret 

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

代码语言:javascript
复制
gcc test.c -o test -O3

我在反汇编中得到的结果是:

代码语言:javascript
复制
push   %ebp
xor    %eax,%eax
mov    %esp,%ebp
pop    %ebp
ret 

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-11 01:27:08

由于您的代码不能有效地执行任何外部可见的操作,从而产生不可预知的副作用,因此完全消除了结构的创建,,现在您的代码所做的就是从main()返回0。

(如果您告诉编译器,它确实需要创建结构,因为它可能会被其他人/某些人修改,它不会删除代码。将变量声明为volatile,您将在汇编程序中看到它。)

票数 12
EN

Stack Overflow用户

发布于 2013-05-11 01:28:36

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16487699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档