Jumping Switches
11 Jun 2018
One of the reasons to prefer a switch case declaration to a bunch of if-else’s is that the compiler can generate a jump table. This is not always the case. Take the example below. Code gen can be found here: https://godbolt.org/g/V7Qdci
// Individual compares
int switch_2_cases(int val) {
switch(val) {
case 0:
return 10;
case 1:
return 20;
}
return 0;
}
// Individual compares
int switch_2_cases_non_contig(int val) {
switch(val) {
case 5:
return 10;
case 11:
return 20;
}
return 0;
}
// Jump table!
int switch_3_cases(int val) {
switch(val) {
case 0:
return 10;
case 1:
return 20;
case 2:
return 30;
}
return 0;
}
// Individual compares
int switch_3_cases_non_contig(int val) {
switch(val) {
case 5:
return 10;
case 11:
return 20;
case 17:
return 30;
}
return 0;
}
In most cases, the compiler will only generate a jump table if your switch case labels are contiguous otherwise, it will probably resort to generating separate comparision instructions for each case. Which means that if you have short if-else statements then converting to a switch case may not be necessary. However, if you do have a very long if-else chain that can be converted to a switch case then please do so since it’s more readable.