LINUX.ORG.RU

Выравнивание кода и данных


0

0

Имею спросить: Есть компилятор. Есть программа. Есть переменные и подпрограммы. Компилятор выравнивает данные (переменные) на 4 байта, а точки входа в подпрограммы выравниваются на 16 байт. Почему так?

anonymous

На практически всех (если не всех) архитектурах процессорах доступ к выравненным определённым образом данным происходит быстрее чем к не выровненным. На некоторых архитектурах доступ к не выровненным данным вообще невозможен, либо делается сильно через ж.

Deleted
()
Ответ на: комментарий от Deleted

Про то, что доступ к выравненным данным быстрее, чем к невыравненным, я знаю. Нужен ответ на другое:

Почему данные выравниваются на 4 байта, а вот код - ажно на целых 16.

anonymous
()

с чего ты взял что данные выравниваются на 4 байта. Под виндой, например, микрософтовский компилятор данные на 8 байт выравнивает

anonymous
()
Ответ на: комментарий от alexru

Архитектура - x86. Компилятор - Sun'овский под Солярис. В GCC вроде с выравниванием так же.

Кстати, что такое в данном случае параграф?

anonymous
()

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.

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

Потому, что код и данные по разному в кэш грузятся.

anonymous
()
Ответ на: комментарий от anonymous

>Кстати, что такое в данном случае параграф?

Не знаю как на других архитектурах на старых 8086 шина адреса была 20 бит, регистры 16 бит, адресация была в виде сегмент<<4+смещение и с учетом того что шина 20 бит полный адрес выглядел 0x12345h. Если младшие 4 бит равны нулю 0х12340 - адрес полностью может быть записан только значением сегментного регистра. 4 битами можно адресовать 16 байт - вот и говороили в таком случае что данные выравнены на границе параграфа который сотавлял 16 байт. Может ты до сих пор под ДОС пишешь ? :)

koTuk
()
Ответ на: комментарий от koTuk

Нет, почтенный. Разрази меня гром, если я пишу не под Solaris 10.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.