Можно ли добавить N количество байтов в конце функции?
Моя простая идея — добавить следующий код:
_asm {
NOP
NOP
NOP
NOP
NOP
}
Есть ли другие способы сделать это? (с кодом, компилятором или другими методами)
Мне нужно это для hotpatching функции. У меня есть функция, которая имеет несколько операторов IF, функция вызывается 10 раз в секунду или чаще. Итак, чтобы повысить производительность, мне нужно делать меньше проверок типа «нужно ли мне выполнять этот код?».
Логическое значение в выражении IF не меняется так часто (я бы сказал, очень редко). Я также хочу добиться этого, если мне не нужно выполнять какой-то код, мне не нужно проверять это.
Вы можете написать функцию с возвратом в одну точку и добавить NOP перед оператором возврата. Хотя это зависит от платформы.
Другой метод заключается в размещении кода мусора перед оператором return и обходе кода мусора с помощью метки и goto
,
Помните об оптимизации компилятора и компоновщика, которая может удалить неиспользуемый код.
В общем, да, хотя для этого вам нужно написать свою функцию в ассемблере.
С другой стороны, похоже, что вы выполняете микрооптимизацию своего кода, а не тестирование его производительности. BOOL и условные выражения в C ++ действительно очень быстрые, и затраты на исправление кодов операций в современных системах могут привести к действительно удивительно плохим потерям производительности (например, вызов VirtualProtect для создания кода для записи будет стоить на сотни тысяч больше, чем единственное условие, и вы будете принудительно останавливать конвейер и пропускать кэш, изменяя встроенную функцию, даже если вы работаете во встроенной системе).
Итак, в общем, да, то, что вы делаете, возможно. Но если вы не выполняете это как упражнение «из интереса» или не выполняете в очень странной среде, где производительность условных программ критически важна, но вы все еще пишете на C, тогда вы, вероятно, захотите просто сравнить свой код вместо этого и найти реальные места. где он медленный, вместо того, чтобы тратить огромные усилия и усилия на исправление тех вещей, которые на самом деле не критичны для производительности.
MSVC имеет опцию компилятора / hotpatch whick позволяет использовать компоновщик / functionpadmin который изменяет обработку окончательного двоичного файла таким образом, что горячая установка должна работать для допустимых функций. Вы можете указать количество зарезервированных байтов, чтобы разрешить горячее исправление. Смотрите ссылку для деталей.
функция вызывается 10 раз в секунду или чаще. Итак, для увеличения производительности
Ваша функция занимает 50-100 миллисекунд времени? Я имею в виду, действительно ли здесь проблема с перфорированием? 10 раз в секунду — ничто для простых и обычных функций, но может быть много для некоторых вычислительных ресурсов.
Не существует универсального способа заставить компилятор сделать это, чтобы зарезервировать некоторое пространство. Возможно, вам удастся найти особый способ для конкретного компилятора, но лучшим подходом было бы иметь несколько версий одного и того же кода или создавать код на лету во время выполнения.