许多情况下的交换机优化可确保任何情况下的访问时间均等 (C ++)

我已经在这里看到了特定语言的答案,关于使用跳转表优化超过5个案例的开关,以保证任何情况下的持续访问时间。
C / C ++是这样的吗?
它特别适用于gcc吗? 对于视觉工作室?
如果没有,按发生频率顺序对案例进行排序有帮助吗?

该标准不保证如何实现switch语句。 我从来没有见过编译器生成哈希表,虽然不少会生成一个跳转表。 除非我的记忆比平常更糟糕,否则当病例足够密集时(对于“足够”的不同值),VS和gcc都可以产生跳转表。 不幸的是,根据发生频率进行排序几乎是不可能的(或者甚至必须弄清楚) – 它不仅在编译器之间有所不同,甚至在同一编译器的不同版本之间也是如此。

  • C和C ++不保证switch语句的运行时间。
  • 我担心我不知道任何编译器的实现细节。 它可能取决于优化标志。
  • 排序案例不能保证有所帮助,标准也没有规定,您的实施可能会也可能不会:
    • 根据编译器选项执行不同的操作
    • 记录它的作用
    • 保证不要改变它在未来版本中的function
    • 完全忽略源中的案例顺序,然后重新排序它们喜欢的顺序。 当然假设案件是“独立的”:没有堕落; 没有变量声明从一个案例开始并跨越另一个案例; 没有别的我忘记了。

c(以及扩展名为c ++)只能切换整数类型,因此不需要散列。 编译器通常会使用适合您正在编译的体系结构的习惯用法。 这可以是索引寻址(如果使用小范围),跳转表或完全不同的东西。

这就是编译器将为您做的事情。 在GCC的情况下,它将使用跳转表。

哈希似乎不是实现交换机的有效方法,因为查找会导致额外的缓存未命中。