在大多数情况下,switch的性能不会比if else低。
在某些特定情况下,编译器能对switch进行优化。比如说:
1. 不按顺序比较,而是构造一个二分查找树(binary decision tree), 这样子比较的平均次数就会下降。
2. 可以做个跳转表(jump table)这样子就不许要任何比较了。比如如下的代码。
int main(int argc, char* argv[])
{
int j = 0;
int n;
cin>>n;
switch(n)
{
case 1: j = 1; break;
case 2: j = 2; break;
case 3: j = 3; break;
case 4: j = 5; break;
default:j = 6;
}
cout<<j<<endl;
return 0
}
其在VS2008编译器下产生的代码如下
switch(n)
00401011 mov eax,dword ptr [esp]
00401014 dec eax
00401015 cmp eax,3 **<==这里只比较了一次,看看是否是default分支**
00401018 ja 0040103D
0040101A jmp dword ptr [eax*4+00401064h] **<==这里直接用了一个跳转表,没有比较语句**
{
case 1: j = 1; break;
00401021 mov eax,1
00401026 jmp 00401042
case 2: j = 2; break;
00401028 mov eax,2
0040102D jmp 00401042
case 3: j = 3; break;
0040102F mov eax,3
00401034 jmp 00401042
case 4: j = 5; break;
00401036 mov eax,5
0040103B jmp 00401042
default:j = 6;
0040103D mov eax,6
}
cout<<j<<endl;
00401042 mov ecx,dword ptr ds:[0040203Ch]
00401048 push ecx
00401049 mov ecx,dword ptr ds:[0040204Ch]
0040104F push eax
00401050 call dword ptr ds:[00402038h]
00401056 mov ecx,eax
00401058 call dword ptr ds:[00402040h]
return 0;