Switch case语句如何在内部实现或工作
How Switch case Statement Implemented or works internally?
我在某处读到switch
语句使用"二进制搜索"或一些排序技术来精确选择正确的情况,这与else-if阶梯相比提高了它的性能。
如果我们按顺序排列,开关会工作得更快吗?是这样吗?你能就此提出你的宝贵建议吗?
我们在这里讨论了同样的问题,并计划作为一个问题发布。
这实际上取决于编译器如何在代码中实现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:
如果不是这种情况,还有其他可能的实现允许在某种程度上"优于条件序列"。
如何实现开关取决于您拥有的值。对于范围很近的值,编译器通常会生成一个跳转表。如果值相差很远,它将生成一个链接分支,使用类似二进制搜索的方法来找到正确的值。
switch语句的顺序并不重要,无论你的顺序是升序、降序还是随机顺序,它都会做同样的事情——做你想做的最有意义的事情。
如果没有别的,switch通常比If -else序列更容易阅读。
在谷歌上我发现了一些有趣的链接,并计划发布作为我的问题的答案。http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem
欢迎评论
虽然它可以以多种方式实现,但这取决于语言设计者希望如何实现它。一种可能的有效方法是使用哈希映射将每个条件(通常是整数)映射到要计算的相应表达式,后跟一个跳转语句。其他解决方案也可能有效,因为switch具有有限条件,但有效的解决方案应该是使用Hash map
相关文章:
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- nth_element基于修改后的quick_sort实现,无法按预期工作
- 这个数组交集的实现是如何工作的
- 查找表究竟是如何工作的,以及如何实现它们
- 只有第一个缓冲区可以在C++中实现的Double缓冲区中工作
- 尝试实现二叉搜索算法,似乎无法使其工作
- popen() 如何工作以及如何在 Linux 上实现它到 C++ 代码中
- opengl32.lib如何在Windows(仅1.1版本)上工作?它是否真正实现了OpenGL函数
- 在 gcc 上自己的元组实现段错误,同时在 clang 中工作
- 运算符 [] 函数的实现是如何工作的
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法
- 实现快速排序,几乎可以工作但不能
- 在Graph实现中,对和向量是如何工作的
- 在C 中实现此类工作流程的最佳方法
- 这种珠子排序算法的 c++ 实现是如何工作的
- 有可能实现一个与数组而不是单个对象一起工作的内存池吗
- 我正试图在我的SFML Platformer中实现双跳,但它并没有按预期的方式工作
- C++,当每个工作线程都必须执行几个不同的任务时,如何为任务实现线程池
- 为什么我的strCopy实现工作