Ну, а почему бы не проверить? Берем простейший код #include <stdio.h>
#include <stdlib.h>
typedef enum{
case1, case2, case3, case4, case5
} cases;
int f1(cases c){
int i = 0;
switch(c){
case case1: i = 1; break;
case case2: i = 2; break;
case case3: i = 3; break;
case case4: i = 4; break;
case case5: i = 5; break;
}
return i;
}
int f2(cases c){
int i = 0;
if(c == case1) i = 1;
else if(c == case2) i = 2;
else if(c == case3) i = 3;
else if(c == case4) i = 4;
else if(c == case5) i = 5;
return i;
}
int main(int argc, char **argv){
cases i = atoi(argv[1]);
printf("f1(%d)=%d\n", i, f1(i));
printf("f2(%d)=%d\n", i, f2(i));
return 0;
}
и смотрим, что там в асме будет.
for ((i=0; i<4; ++i)); do gcc -O$i 1.c -S -o testO${i}.s; done
С O0 он свич именно по таблице сделал, а ифы тупо так ифами и оставил.
С O1 свич тоже табличный, но "прелюдия" функции короче. Зато ифы он полностью аналогично - заменил свичами.
С O2 этот говнюк тупо в свичах отнял единицу от аргумента и отправил в ответ (а если входной аргумент за пределами положенного - возвращает нуль). Полностью аналогично выглядит с ифами.
У O3 вообще никакой разницы с О2 нет.
Вывод: gcc при необходимости не только if'ы на свичи заменяет, так еще и хитрожопить может!