switchコンストラクトは、より簡単にジャンプ (またはブランチ) テーブルに変換されます。これにより、case ラベルが近接している場合に、 switch ステートメントをif-elseよりもはるかに効率的にすることができます。アイデアは、一連のジャンプ命令をメモリに順番に配置し、その値をプログラム カウンターに追加することです。これにより、一連の比較命令が加算操作に置き換えられます。
以下は、非常に単純化された疑似アセンブリの例です。まず、if-else バージョン:
// C version
if (1 == value)
function1();
else if (2 == value)
function2();
else if (3 == value)
function3();
// assembly version
compare value, 1
jump if zero label1
compare value, 2
jump if zero label2
compare value, 3
jump if zero label3
label1:
call function1
label2:
call function2
label3:
call function3
次はスイッチ版です。
// C version
switch (value) {
case 1: function1(); break;
case 2: function2(); break;
case 3: function3(); break;
}
// assembly version
add program_counter, value
call function1
call function2
call function3
結果のアセンブリ コードがはるかにコンパクトになっていることがわかります。1、2、および 3 以外の値を処理するには、何らかの方法で値を変換する必要があることに注意してください。ただし、これは概念を説明するものです。