GNU C Extensions提供specification of label declarations,因此可以将标签分配给goto
可以使用的变量。虽然我承认goto
在某些情况下有意义(例如替代高级语言中的异常处理),但我不明白这种goto
语言扩展是如何被证明的。您能提供一个具体的例子,标签值可以带来哪些好处吗?
答案 0 :(得分:3)
我曾经用它做过一次有效的线程调度。想象一下翻译的内循环:
while (1) {
switch ( *instruction_pointer ) {
case INSTR_A:
...
break;
case INSTR_B:
...
break;
...
}
++instruction_pointer;
}
循环结构本身最大的性能问题是,在处理所有指令的swtich语句中有一个分支(理想情况下)。那个分支永远无法正确预测。使用线程调度,您可以为每个案例添加显式代码,以转到下一个:
void *instructions[] = { &&instr_a, &&instr_b, ... };
...
goto *instructions[*instruction_pointer];
instr_a:
...
goto *instructions[*++instruction_pointer];
instr_b:
...
goto *instructions[*++instruction_pointer];
每条指令都能直接跳转到下一条指令的开头。由于CPU分支预测,通用的指令序列更快。它保证了跳转表的实现,如果指令空间稍微稀疏,那么交换机可能无法正常工作。