Dans ton sujet, avec la bonne optimisation, que soit le if ou le switch, c'est le même résultat.
En regardant sur Internet très vite fait
gcc semble grandement ne pas utiliser les tables de correspondance (LUT)
À partir d'ici tout est hyper théorique 
Ce que tu sembles ne pas avoir compris, dans 1 LUT tu dois mettre 1 pointeur de fonction (ou directement le code en mode "inline" (ne me demande pas le comment
)).
Pour 1 switch :
1 2 3 4 5 6 7 8
| switch(c) {
case(1):
do 1;
case(2):
do 2;
default:
do 3;
} |
Devient
| case 0: pointeur vers do1 | case 1: pointeur vers do2 | case 2: pointeur vers do3 |
Tu vois que tu transformes 1 [série de] test (c == 1, c == 2, ...) en index LUT[(c - 1)] ((c - 1) doit être clampé sur l'intervalle 0 <-> 2, donc effectivement 1 test si l'index est non signé)
Oui c'est très théorique parce qu'il faut prendre en compte l'espace entre les valeurs, le nombres de cas (tu l'as évoqué), ...
J'ai vu que sur ARM, tu avais 1 LUT prévu avec 16 indexes.
Regarde mon message : if (n != 1), tu ne peux pas le transformer en switch parce que tu as 1 infinité de possibilité (c'était mon point)
Mais if (n == 1), tu peux le convertir en switch d'1 seul cas et 1 défaut : donc 1 LUT de 2 cases
| case 0: pointeur vers le code (n==1) | case 1: pointeur vers le défaut |
Édit : le vrai terme c'est jump table/ branch table. branch table, lien wikipedia en anglais
le lien reprend les 2 méthodes : celle de @Sve@r (avec les goto) et la mienne (avec les pointeurs)
Partager