ユーザー設定に応じて実行するかどうかに関係なく、オプションのコードを実行する関数を作成したいと思います。この関数は CPU を集中的に使用し、分岐予測子があまり良くないため、ifs が含まれていると遅くなります。
私の考えは、関数のメモリ内にコピーを作成し、コードを実行したくないときに NOP をジャンプに置き換えることです。私の作業例は次のようになります。
int Test()
{
int x = 2;
for (int i=0 ; i<10 ; i++)
{
x *= 2;
__asm {NOP}; // to skip it replace this
__asm {NOP}; // by JMP 2 (after the goto)
x *= 2; // Op to skip or not
x *= 2;
}
return x;
}
私のテストのメインでは、この関数を新しく割り当てられた実行可能メモリにコピーし、NOP を JMP 2 に置き換えて、次の x *= 2 が実行されないようにします。JMP 2 は、実際には「次の 2 バイトをスキップする」ものです。
問題は、スキップするコードを編集してサイズを変更するたびに、JMP オペランドを変更する必要があることです。
この問題を解決する別の方法は次のとおりです。
__asm {NOP}; // to skip it replace this
__asm {NOP}; // by JMP 2 (after the goto)
goto dont_do_it;
x *= 2; // Op to skip or not
dont_do_it:
x *= 2;
次に、固定サイズのgotoをスキップするかどうかを選択します。残念ながら、完全最適化モードでは、goto と x*=2 はコンパイル時に到達できないため削除されます。
したがって、そのデッドコードを保持する必要があります。
VStudio 2008 を使用しています。