Я хотел бы написать функцию, которая будет иметь дополнительный код, который будет выполняться или нет, в зависимости от пользовательских настроек. Эта функция интенсивно использует процессор, и наличие if в ней будет медленным, поскольку предиктор ветвления не так хорош.
Моя идея - сделать копию в памяти функции и заменить 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.