任何编译器都没有将大型交换机块转换为二叉树?

0 c++ compiler-construction compiler-optimization

我已经读过现代C++编译器将大块switch转换成二进制树以便在运行时更快地查找,这适用于所有现代C++编译器吗?我主要使用英特尔C++编译器和G ++.

gex*_*ide 5

如果您的case值彼此接近,那么最有效的方法是跳转表,这通常是所有编译器的目标.如果值很稀疏,那么编译器通常会选择"binary-if-tree".

最佳解决方案:不要考虑它.假设a switch速度相当快.其他一切都闻起来像是过早优化.如果您确实遇到a switch是程序的瓶颈,那么您只能通过查看生成的目标代码来了解生成的内容.

如果您只在每种情况下分配一个变量,编译器甚至可能会生成完全不同的东西,如条件移动.所以,如果不看生成的程序集,你永远不会知道.

如果你有很多稀疏的值,然后使用哈希表可能比更快switch,因为它是O(1)在比较O(log n)的"二元如果树".