switch文とif文の実行速度やメモリの使用量について

if文はメンテナンス性を考えると効率が悪い方法というのを知っています。

enum Act{ AAA, AAB, ... , ZZZ};
if ( AAA == ch ){...}
else if( AAB == ch ){...}
...
else if( ZZZ == ch ){...}
else{...}

そこで、switch文を使うのですが、、カッコも悪く効率も悪そうです。

switch ( ch ){
case AAA: ... break;
case AAB: ... break;
...
case ZZZ: ... break;
default: ... break;
}

なぜなら、コンパイルの結果同じバイナリコードが生成されているとしたら
上から順に比較することになり最悪で26^3回の比較が必要になるからです。
26^3回がコンピュータにとってたいした数ではないかもしれませんが、極力多くしてみました。
それに始めて見たときにこのコードに対して、知的さを感じず快く思いませんでした。
そこで以下のようなコードを考えました。

void (*name[])(void*)={ aaa, aab, ... , zzz};
name[ch](NULL);
aaa(void* a){}
aab(void* a){}
...
zzz(void* a){}

これなら関数になるので抜け出す処理が記述されていても納得ですし。
caseがどんなに増えてもアクセスは定数時間かと思います。
巨大なswitch文が一人で居座るわけでなくなるので、ファイルの分割も行いやすくなります。
分割してコンパイルしていればそれ相応に恩恵を受けるかと思います。
ただ、ひとつ関数が増えるたびに変更する箇所がenumと配列,caseだけのswitchと比べたら手間になってしまっている気がします。

実際の現場ではどれが利用されて居るのでしょうか。
内心はif<3~5 switch<10 それ以上では、配列関数ポインタ又は、関数へのポインタの配列、もしくは関数の配列(実は名前を知らない)を利用したほうがよいと思うのですが、規則や効率など総合的に見てこういった書き方はどうなのでしょう。