Компилятор будет генерировать NOP для выравнивания кода - например, на некоторых итерациях x86 переходы выполняются быстрее, если переход destination выровнен по 4-, 8- или даже 16-граница байта.
Некоторые компиляторы пытаются использовать «длинные NOP», когда это возможно - отдельные инструкции, занимающие более одного байта пространства, которые могут формально что-то делать, но не влияют на состояние процессора - какна некоторых итерациях архитектуры x86 это быстрее.Например, 66 90
- это двухбайтовая NOP, а 8d 74 26 00
- это четырехбайтовая NOP (технически lea 0(%esi,%eiz,1),%esi
, но, как вы можете видеть, это просто копирует значение из %esi
в себя, поэтому эффекта нет).Однако их нельзя использовать во всех случаях, и последовательности, которые являются самыми быстрыми на некоторых x86, очень удручающе часто медленны на других.Я не читал текущие рекомендации по микрооптимизации, но не удивлюсь, если бы Intel и AMD работали над тем, чтобы сделать строку из 90
s самым быстрым способом сделать длинный NOP, и их компиляторы совпали.