New-ish versions of gcc allow people to specify optimization
options per function:
https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
optimize
The optimize attribute is used to specify that a function is to be compiled
with different optimization options than specified on the command line.
Arguments can either be numbers or strings. Numbers are assumed to be an
optimization level. Strings that begin with O are assumed to be an
optimization option, while other options are assumed to be used with
a -f prefix.
How about not aligning code by default, and using
#define hot_func __attribute__((optimize("O2","align-functions=16","align-jumps=16")))