一、背景介绍
在前面的一些分析介绍以及网上的资料或者书籍中,都有说过如果条件分支语句较多时,推荐使用switch而不要使用if语句,因为前者的速度比后者要快,特别是数量多时,会比较明显。但其实这句话是有问题的。在经常写类似条件语句的开发者眼中看来,可能很少考虑二者到底有什么不同,心中有一个大概的印象就可以了。真正开发时,很少有这种较真的场景。
答案确实也是如此。但正因为这样,大多数的开发者往往忽略这个问题或者觉得它不值一哂。但学习的过程不能放过每一个细节,可以不对其重视,但不能不知道其所以然。
二、if和switch的处理
一般来说,传统的认知中可能是下面的想法:
1、if会对条件进行反复不断的比较来最终确定跳转的分支语句
2、switch则会是查一个表来进行跳转,所以它的效率会高
但事实一定是这样么?
整体上来言,上面的下意识的想法不能说错误,只能说不完全正确。但是实际上编译器的处理还是有一定的复杂性的:
1、编译器优化的情况下,二者没有差别的。所以,在前面反复提到过不要小看编译器的进步
2、即使是在没有开优化的前提下,如果值的内容有所不同,也有可能产生一些意想不到的情况。比如值比较分散,则编译器对switch使用二分查找方式,如果比较连续,则使用无冲突的散列表来进行处理。
3、在非常少的比较时,二者几乎也没有什么差距,比如只有两个分支
看一下这个例子:
#include <iostream>
using namespace std;
void testIf(int d) {
if (d == 1) {
std::cout << "call 1 !" << std::endl;
} else if (d == 2) {
std::cout << "call 2 !" << std::endl;
} else if (d == 3) {