共有回帖数  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号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知