c编译器是否可以转换&if-elseif'进入一个开关' bloc优化代码?

时间:2016-01-28 14:32:16

标签: c compiler-optimization

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;
}

如果每次可行的话都有可能,那么再有一个优势,那就是......如果......其他'集团开关'集团?

3 个答案:

答案 0 :(得分:3)

case中,您从未听说过" as-if"规则:here it is。这意味着,允许编译器在某些情况下 if switch ,是的。

应尽可能使用

switch;它为编译器提供了有关解析数据类型的更多信息,并使其能够构建类似哈希表的内容 当if无法使用时,应使用switch。这很简单。

答案 1 :(得分:3)

只要程序意图不以任何方式改变,c编译器就可以进行任何喜欢的优化。

注意switch只能出现在整数类型上,在您的情况下转换为switch似乎是最佳的。如果合适,请相信您的优化人员进行此类转换。您始终可以检查输出组件以进行验证。

答案 2 :(得分:3)

编译器将C代码转换为机器代码。在汇编程序级别,没有ifelseswitch这样的东西。只有条件分支和非条件分支。

所以,不,编译器永远不会像你建议的那样做任何事情,因为可以用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一样。