Имею спросить: Есть компилятор. Есть программа. Есть переменные и подпрограммы. Компилятор выравнивает данные (переменные) на 4 байта, а точки входа в подпрограммы выравниваются на 16 байт. Почему так?
На практически всех (если не всех) архитектурах процессорах доступ к выравненным определённым образом данным происходит быстрее чем к не выровненным. На некоторых архитектурах доступ к не выровненным данным вообще невозможен, либо делается сильно через ж.
Pentium II and Pentium III processors have a cache line size of 32 bytes.
Since the instruction prefetch buffers fetch on 16-byte boundaries, code
alignment has a direct impact on prefetch buffer efficiency.
For optimal performance across the Intel architecture family, the following
is recommended:
• Loop entry labels should be 16-byte-aligned when less than eight bytes
away from a 16-byte boundary.
• Labels that follow a conditional branch need not be aligned.
• Labels that follow an unconditional branch or function call should be
16-byte-aligned when less than eight bytes away from a 16-byte
boundary.
Не знаю как на других архитектурах на старых 8086 шина адреса была 20 бит, регистры 16 бит, адресация была в виде сегмент<<4+смещение и с учетом того что шина 20 бит полный адрес выглядел 0x12345h. Если младшие 4 бит равны нулю 0х12340 - адрес полностью может быть записан только значением сегментного регистра. 4 битами можно адресовать 16 байт - вот и говороили в таком случае что данные выравнены на границе параграфа который сотавлял 16 байт. Может ты до сих пор под ДОС пишешь ? :)