避免在开关语句中进行分支操作

Avoiding Branch Operations in Switch Statements

本文关键字:分支 操作 语句 开关      更新时间:2023-10-16

而不是一个又一个分支运行一个又一个分支的开关语句,是否有让程序集在数组中查找 goto 语句的列表?或者这通常在编译器中进行了优化?

这种优化对于具有常量值的大型开关语句将有很大帮助。

前任:

switch(test) {
case 1:
// Do something
break;
case 2:
// Do something
break;
}

"优化":

action_link[] = {action_1, action_2};
goto action_link[test];
action_1:
// Do Something
action_2:
// Do Something

编译器将根据您的优化设置及其关于可能构成良好跳转表的启发式方法为您做出此决定。

在许多简单的情况下,编译器可能会决定朴素的测试和跳转链比等效的跳转表更快或更小。

这确实是你应该对一个像样的编译器所期望的。事实上,switch语句的限制是基于使其易于转换为"跳转表"而不是多个分支。 回到黎明,FORTRAN出于同样的原因拥有"计算GOTO"。