共有回帖数 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 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知