c - 标签声明和标签值什么时候有意义?

标签 c gcc goto

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

最佳答案

我使用它取得良好效果的一次是用于线程调度。想象一下解释器的内部循环:

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/

相关文章:

c - 确定数据包类型是 IPv4 还是 IPv6

c++ - 如何在类成员函数内部的printf中获取编译警告

c++ - 如何在Linux中编译隐藏源文件的C++代码?

c - "goto"语句对CPU的 "branch prediction"有什么影响?

java - 为什么 goto 在 Java 和其他高级编程语言中被认为是邪恶的?

c - 使用 OpenMP 并行递增数组元素

c++ - 无法将 int 转换为 int *

ubuntu - 如何静态链接库以构建共享库

algorithm - 在没有循环或 if 语句的情况下执行循环 x 次

c - GLX 垂直同步事件