c++ - Switch case 语句如何在内部实现或工作?

标签 c++ c gcc if-statement switch-statement

我在某处读到 switch 语句使用“二进制搜索”或一些排序技术来准确选择正确的大小写,与 else-if 阶梯相比,这提高了它的性能。

此外,如果我们按顺序给出案例,开关是否工作得更快?是这样吗?您能对此提出宝贵的建议吗?

我们讨论了here大致相同,并计划作为问题发布。

最佳答案

switch 语句如何在代码中实现实际上取决于编译器。

不过,我的理解是在合适的时候(也就是比较密集的情况),使用跳转表。

这意味着类似:

switch(i) {
  case 0: doZero(); break;
  case 1: doOne();
  case 2: doTwo(); break;
  default: doDefault();
}

最终会被编译成类似的东西(可怕的伪汇编器,但我希望它应该很清楚)。

load i into REG
compare REG to 2
if greater, jmp to DEFAULT
compare REG to 0
if less jmp to DEFAULT
jmp to table[REG]
data table
  ZERO
  ONE
  TWO
end data
ZERO: call doZero
jmp END
ONE: call doOne
TWO: call doTwo
jmp END
DEFAULT: call doDefault
END:

如果不是这种情况,还有其他可能的实现允许某种程度的“优于一系列条件”。

关于c++ - Switch case 语句如何在内部实现或工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14067547/

相关文章:

c - 带减法的无符号字符溢出

c++ - 从 C++ 中的实例化进程获取输出的可靠方法是什么?

c++ - C++中的所有临时右值吗?

c++ - 在 C++ 中链接和通信到 AutoCAD

c++ - 使用GCC对C文件进行部分预处理(不删除 “define”指令)

gcc - 在 CentOS 7 上找不到 GLIBCXX_3.4.21

c++ - 比较两个 vector<bool> 与 SSE

c - 函数/方法返回时返回 void*

c - 为什么头文件可以包含自身?

c - 为什么在 C 中使用 `sigsetjmp` 而不是 `setjmp` 函数?