Выравнивание по 4 байтам.

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Выравнивание по 4 байтам.

Сообщение Debugger » 21.12.2011 (Ср) 18:05

Все знают, что данные выравниваются по четырехбайтной границе для увеличения скорости работы. Любое невыровненное чтение раскладывается на два выровненных и дополнительные операции, если верить некоторым источникам. Вопрос: написано ли в каком-нибудь стандарте это правило выравнивания или же это не правило, а устная рекомендация?
И почему Си выравнивает данные в структурах по максимальному размеру элемента?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.12.2011 (Ср) 18:16

Весьма сомнительные сведения, по-моему...

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.12.2011 (Ср) 18:29

Проверил на VS2010 и VS2005. Действительно выравнивается как написано :)

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Выравнивание по 4 байтам.

Сообщение jangle » 22.12.2011 (Чт) 9:59

Для современных процессоров выравнивание данных бессмысленно.

Вплоть до появления Pentium Pro, процессоры крайне болезненно относитесь к не выровненным переходам и вызовам функций, чей адрес не был кратен 4 байтам, и давали за это штрафные такты (называемые "пенальти"), что объяснялось несовершенством микропроцессорной архитектуры тех лет.

Начиная с Pentium II+ и AMD K6+ процессоры уже не требуют постоянного выравнивания переходов/вызова функций, исключая тот случай, когда целевая инструкция или команда перехода пересекает границу линейки кэш-памяти первого уровня, "расщеплялась" напополам, за что выдается пенальти, причем Pentium 4, компилирующий x86-инструкции в микрокод, выдает его значительно реже и совершенно непредсказуемым образом - микроинструкции абсолютно недокументированны, их длина неизвестна, следовательно, управлять их выравниванием мы не можем.

Несмотря на то, что Pentium 4 де-факто является самым популярным процессором и непоколебимым лидером рынка, большинство компиляторов упорно продолжают заниматься выравниванием, располагая инструкции перехода по кратным адресам и заполняя образующиеся "дыры" незначащими инструкциями, такими как NOP, MOV EAX, EAX и др. Естественно, это увеличивает размер кода, снижая его производительность и агрессивное выравнивание только вредит.

Компилятор Intel C++ вообще не выравнивает ни переходов, ни циклов, что является лучшей стратегией для Pentium 4, а вот на более ранних процессорах мы получаем неустойчивый код с "плавающей" производительностью, быстродействие которого зависит от того, расщепляются ли глубоко вложенные переходы или нет. А это в свою очередь зависит от множества трудно прогнозируемых обстоятельств, включая фазу луны и количество осадков.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Выравнивание по 4 байтам.

Сообщение Хакер » 22.12.2011 (Чт) 12:15

jangle.
Ты как всегда оригинален.

В вопросе говорится о выравнивании данных.
Ты же привёл текст, в котором говорится о выравнивании инструкций в коде.

И предварил его ложным комментарием. Вырванивание важно. Где-то работает и без выравнивания, но медленнее, а где-то без выравнивания совсем нельзя (Interlocked-функции).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 21

    TopList