标签声明和标签值何时有意义?

时间:2014-03-20 05:17:19

标签: c gcc goto

GNU C Extensions提供specification of label declarations,因此可以将标签分配给goto可以使用的变量。虽然我承认goto在某些情况下有意义(例如替代高级语言中的异常处理),但我不明白这种goto语言扩展是如何被证明的。您能提供一个具体的例子,标签值可以带来哪些好处吗?

1 个答案:

答案 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分支预测,通用的指令序列更快。它保证了跳转表的实现,如果指令空间稍微稀疏,那么交换机可能无法正常工作。