【发布时间】:2023-03-10 06:04:01
【问题描述】:
GNU C 扩展提供了一个specification of label declarations,以便标签可以分配给gotos 可以使用的变量。虽然我承认 goto 在某些情况下是有意义的(例如,作为高级语言中异常处理的替代品),但我不明白这个 goto 语言扩展如何合理。你能提供一个具体的例子,标签值带来好处吗?
【问题讨论】:
GNU C 扩展提供了一个specification of label declarations,以便标签可以分配给gotos 可以使用的变量。虽然我承认 goto 在某些情况下是有意义的(例如,作为高级语言中异常处理的替代品),但我不明白这个 goto 语言扩展如何合理。你能提供一个具体的例子,标签值带来好处吗?
【问题讨论】:
有一次我使用它取得了很好的效果是线程调度。想象一下解释器的内部循环:
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 分支预测,通用指令序列更快。并且它保证了跳转表的实现,如果指令空间稍微稀疏,切换可能不会以这种方式工作。
【讨论】: