我想编写一个函数,该函数将根据用户设置执行或不执行一些可选代码。该函数是 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;
}
在我的测试主程序中,我将此函数复制到新分配的可执行内存中,并用 JMP 2 替换 NOP,以便不执行以下 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。