签到

05月06日
尚未签到

共有回帖数 0

    战神

    等级:
    今天研究了gcc中switch的一些反汇编码, 最后总结出, gcc中的switch实在太强...

    一直以来我总以为switch会从头到尾一个值一个值地比较, 这应该是turboc2时代给我的印像, 因为turboc2不管switch中case列表有多长都是一个个比较, 所以效率太慢, 但gcc中的switch(我用gcc4.0), 却有特殊的规定和作用, 首先, case语句里只能为整数常量(tc中可以有浮点常量), 因为gcc尽量为每个switch生成一张跳转表, 有浮点的话就不能做到, 生成跳转表每次switch都只做一小点加法就跳转到需要的case, 而也不是每个switch都会有跳转表, 要它生成跳转表, 首先, 所有case 后面的常量差距不能太大, 太大的话这张哈希表就太长了, 另外就是要有足够的分支, 令人惊讶的是, 这并不与优化程度有关, 目前测试是=5个case时可以生成这张表...

    现在可以知道如何用case来提高程序效率了.

    另外一个发现:
    很多时候希望可以像这样:
    #define AAA 1

    #if AAA == 0
     ...
    #elseif AAA == 1
     ...
    #elseif AAA == 2
     ...
    #endif

    也就是说预编译中加入常量比较处理, 这一直是我想要的, 对某个宏进行比较然后条件编译.
    但C的预处理无法满足要求, 怎么办?
    今天发现可以用switch来解决:
    switch(AAA) {
    case 1:
    ...
    case 2:
    ...
    case 3:
    ...
    ...
    }

    当然各个case间不能有相互的影响, 如重复的变量定义等(还是有点可惜, 不过可以试着加个{}), 然后只能发生在函数体内...
    写成上面那个形式后, gcc处理常量的switch会删减其它值, 如果AAA为1, 则整套语句就剩下case 1:里的东西...这种优化在没有打开优化的情况下也会发生.

    最后发现O4优化会生成+10% - +30%的代码量...郁闷...

    楼主 2016-02-25 13:17 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知