2vi*_*on2 23 c c++ gcc if-statement switch-statement
我在某处读到该switch语句使用"二进制搜索"或一些排序技术来精确选择正确的情况,与else-if梯形图相比,这增加了它的性能.
如果我们按顺序给出案例,那么交换机的工作速度会更快吗?是这样吗?你能在这个问题上添加宝贵的建议吗?
我们在这里讨论了相同的问题并计划发布作为一个问题.
Vat*_*ine 19
实际上,编译器如何switch在代码中实现语句.
但是,我的理解是,当它适合时(即相对密集的情况),使用跳转表.
这意味着:
switch(i) {
case 0: doZero(); break;
case 1: doOne();
case 2: doTwo(); break;
default: doDefault();
}
Run Code Online (Sandbox Code Playgroud)
最终会被编译成类似的东西(可怕的伪装配器,但我希望它应该很清楚).
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:
Run Code Online (Sandbox Code Playgroud)
如果不是这种情况,那么还有其他可能的实现允许某种程度的"比一系列条件更好".
如何实施swtich取决于你拥有的价值观.对于范围内接近的值,编译器通常会生成跳转表.如果值相距很远,它将生成一个链接分支,使用二进制搜索之类的东西来查找正确的值.
这样的switch语句的顺序无关紧要,无论你是按升序,降序还是随机顺序,它都会做同样的事情 - 做一些关于你想做什么最有意义的事情.
如果没有别的,切换通常比if-else序列更容易阅读.