免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1700 | 回复: 9
打印 上一主题 下一主题

GCC 编译的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-11 16:24 |只看该作者 |倒序浏览
下面一段代码:

  1. void foo(data* dp)
  2. {
  3.     if (dp->flags != F_NICE)
  4.         return;
  5.     int i =0, j =0, k=0;
  6.     ...
  7.     return;
  8. }
复制代码

为什么编译出来的代码是:

  1. push %ebp
  2. mov  %esp, %ebp
  3. sub  $0xc,%esp  //为什么不直接执行比较的再决定是否要压栈呢?
  4. ...
  5. cmp  ...
  6. jne   ...
复制代码

怎么能让gcc按照我的流程编译呢?
内嵌汇编这个不用说了。

[ 本帖最后由 Momoass 于 2006-6-11 16:30 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-06-11 21:04 |只看该作者
原帖由 Momoass 于 2006-6-11 16:24 发表
下面一段代码:

  1. void foo(data* dp)
  2. {
  3.     if (dp->flags != F_NICE)
  4.         return;
  5.     int i =0, j =0, k=0;
  6.     ...
  7.     return;
  8. }
复制代码

为什么编译出来的代码是:
[code]
push % ...



1、gcc 为什么要像你说的那样做呢? 恐怕没有任何一款编译器会那样做,这样做会产生不稳定因素!

2、sub $0xc,  %esp   是分配变量空间,不是压栈

论坛徽章:
0
3 [报告]
发表于 2006-06-11 22:05 |只看该作者
我用汇编写了那么多还没见过什么不稳定的因素。
在低速的CPU上面要做的是精益求精,多执行一条指令或者指令执行顺序不一都对执行效率有影响。
我只是希望编译器能够严格按照的我流程来编译而已,看来越高级的编译器的可控性越低,写核心模块还得用汇编啊。
上面我只是简单举个例子而已,现实中还有更加复杂的变量初始化和分配工作,要等他们都初始完了再对那个是否继续的条件进行比较,这样对效能的影响是很大。

论坛徽章:
0
4 [报告]
发表于 2006-06-11 22:18 |只看该作者


你用汇编写了这么多??

非常质疑!如果你真的很了解汇编,是不致于问出这样的问题的

并且,可以看出来,你的水平也未达到你所说的那样地步

编译器它有它固定的算法,你看过那个编译器是这样做法的?

当然,你可以自己直接用汇编写,

你精益求精的话,你用汇编的角度去思考汇编,不要用C角度去思考汇编

论坛徽章:
0
5 [报告]
发表于 2006-06-11 22:56 |只看该作者
哎,不想引起口水战,版主帮我结贴吧。

论坛徽章:
0
6 [报告]
发表于 2006-06-12 07:45 |只看该作者
原帖由 Momoass 于 2006-6-11 00:24 发表
下面一段代码:

  1. void foo(data* dp)
  2. {
  3.     if (dp->flags != F_NICE)
  4.         return;
  5.     int i =0, j =0, k=0;
  6.     ...
  7.     return;
  8. }
复制代码

为什么编译出来的代码是:
[code]
push % ...


汗。。你没开编译优化吧,不然编译出来的代码应该不是这样的。

论坛徽章:
0
7 [报告]
发表于 2006-06-12 10:37 |只看该作者
除非一个函数 极度频繁地 被调用, 才可能需要加上-fomit-frmae-pointer之类的选项, 这样可以省去 创建/撤消 栈帧的时间。  你说的功能编译器不大可能提供的

论坛徽章:
0
8 [报告]
发表于 2006-06-12 10:38 |只看该作者
上面贴出的得确是没开优化的结果。
开了优化只有O1的结果不同,O2,O3的结果是一样的。

论坛徽章:
0
9 [报告]
发表于 2006-06-13 11:51 |只看该作者
lz应该把汇编贴完整吧

push %ebp
mov  %esp, %ebp

这两句看上去象是函数调用时候 保存现场的压栈 不是你程序变量的压栈..................
第三句是分配栈空间
关键部分没贴出来....

论坛徽章:
0
10 [报告]
发表于 2006-06-13 14:36 |只看该作者
既然楼主你想让编译器编译必须出你想要的汇编代码,那不如直接用汇编算了。编译器只要符合标准, 编译成什么样是它的自由。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP