Страница 1 из 1

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

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

СообщениеДобавлено: 21.12.2011 (Ср) 18:16
Qwertiy
Весьма сомнительные сведения, по-моему...

СообщениеДобавлено: 21.12.2011 (Ср) 18:29
Qwertiy
Проверил на VS2010 и VS2005. Действительно выравнивается как написано :)

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

СообщениеДобавлено: 22.12.2011 (Чт) 9:59
jangle
Для современных процессоров выравнивание данных бессмысленно.

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

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

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

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

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

СообщениеДобавлено: 22.12.2011 (Чт) 12:15
Хакер
jangle.
Ты как всегда оригинален.

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

И предварил его ложным комментарием. Вырванивание важно. Где-то работает и без выравнивания, но медленнее, а где-то без выравнивания совсем нельзя (Interlocked-функции).