GNU C 扩展提供 specification of label declarations ,以便可以将标签分配给 goto
可以使用的变量。虽然我承认 goto 在某些情况下有意义(例如,作为高级语言中异常处理的替代品),但我不明白如何证明这种 goto 语言扩展是合理的。您能提供一个具体的例子来说明标签值带来的好处吗?
最佳答案
我使用它取得良好效果的一次是用于线程调度。想象一下解释器的内部循环:
while (1) {
switch ( *instruction_pointer ) {
case INSTR_A:
...
break;
case INSTR_B:
...
break;
...
}
++instruction_pointer;
}
循环结构本身的最大性能问题是在处理所有指令的 switch 语句中有一个分支(理想情况下)。永远无法正确预测该分支。使用线程调度,您可以向每个案例添加显式代码以转到下一个案例:
void *instructions[] = { &&instr_a, &&instr_b, ... };
...
goto *instructions[*instruction_pointer];
instr_a:
...
goto *instructions[*++instruction_pointer];
instr_b:
...
goto *instructions[*++instruction_pointer];
每条指令都可以直接跳转到下一条指令的开头。由于 CPU 分支预测,通用指令序列速度更快。它保证了跳转表的实现,如果指令空间稍微稀疏,则切换可能无法以这种方式工作。
关于c - 标签声明和标签值什么时候有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22524048/