【问题标题】:When do label declarations and label values make sense?标签声明和标签值何时有意义?
【发布时间】:2023-03-10 06:04:01
【问题描述】:

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

【问题讨论】:

    标签: c gcc goto


    【解决方案1】:

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

    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 分支预测,通用指令序列更快。并且它保证了跳转表的实现,如果指令空间稍微稀疏,切换可能不会以这种方式工作。

    【讨论】:

    • 我在手册页上阅读了有关线程调度的信息,但不确定实现的样子。现在很清楚了。谢谢!
    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多