Обивка создается ассемблером, а не gcc. Он просто видит директиву .align
(или эквивалентную) и не знает, находится ли пространство, которое должно быть дополнено, внутри функции (например, выравнивание цикла) или между функциями, поэтому он должен вставить NOP
s некоторого вида. Современные ассемблеры x86 используют как можно больше операционных кодов NOP
с намерением потратить как можно меньше циклов, если заполнение предназначено для выравнивания циклов.
Лично я крайне скептически отношусь к выравниванию как к технике оптимизации. Я никогда не видел, чтобы это сильно помогало, и это может определенно повредить, если значительно увеличить общий размер кода (и использование кэша). Если вы используете уровень оптимизации -Os
, он по умолчанию отключен, так что вам не о чем беспокоиться. В противном случае вы можете отключить все выравнивания с соответствующими параметрами -f
.