c编译器是否可以转换' if-elseif'进入一个开关' bloc优化代码?
以下代码:
if ( a == 1 ) {
bloc1
} else if ( a == 2 ) {
bloc2
} else if ( ... ) {
....
} else if ( a == n ) {
bloc n
}
编译期间转换为:
switch(a) {
case 1:
bloc1
break;
case 2:
bloc2
break;
...
case n:
blocn
break;
}
如果每次可行的话都有可能,那么再有一个优势,那就是......如果......其他'集团开关'集团?
答案 0 :(得分:3)
在case
中,您从未听说过" as-if"规则:here it is。这意味着,允许编译器在某些情况下 if
switch
,是的。
switch
;它为编译器提供了有关解析数据类型的更多信息,并使其能够构建类似哈希表的内容
当if
无法使用时,应使用switch
。这很简单。
答案 1 :(得分:3)
只要程序意图不以任何方式改变,c编译器就可以进行任何喜欢的优化。
注意switch
只能出现在整数类型上,在您的情况下转换为switch
似乎是最佳的。如果合适,请相信您的优化人员进行此类转换。您始终可以检查输出组件以进行验证。
答案 2 :(得分:3)
编译器将C代码转换为机器代码。在汇编程序级别,没有if
,else
或switch
这样的东西。只有条件分支和非条件分支。
所以,不,编译器永远不会像你建议的那样做任何事情,因为可以用if-else
替换的switch
已经导致相同的机器代码,无论你是哪一个中写道。没有中间的“转换C到C”步骤。
出于这个原因,switch
是一种模糊的语言特征,因为它在理论上完全是多余的。 switch
导致更易读或更不易读的代码是主观的。它可以根据具体情况进行。
特例:
当所有switch
标签都是相邻的整数常量时,编译器可以执行case
语句的共同优化,那就是用一个数组替换整个switch
函数指针。然后,它可以简单地使用switch
条件作为数组索引来确定要调用的函数。无需比较。这是一个非常激进的优化,因为它消除了大量的比较,从而加快了代码速度,改进了分支预测等。
如果你有一个if - else if
链,可以进行同样的优化,如下所示:
if(n==0)
{ }
else if(n==1)
{ }
else if(n==2)
{ }
...
这也可以优化为函数指针数组,就像它被写成switch
一样。