Что означает «память выровнена на 8 байтов»? - PullRequest
26 голосов
/ 17 мая 2010

Проходя один проект, я увидел, что данные памяти «выровнены по 8 байтов». Может кто-нибудь объяснить, что это значит?

Ответы [ 4 ]

39 голосов
/ 17 мая 2010

Объект, «выровненный по 8 байтов», сохраняется по адресу памяти, кратному 8.

Многие процессоры будут загружать только некоторые типы данных из выровненных местоположений; на других процессорах такой доступ просто быстрее. Есть также несколько других возможных причин использования выравнивания памяти - не видя код, трудно сказать, почему.


Выровненный доступ быстрее, потому что внешняя шина к памяти не имеет ширину в один байт - обычно она составляет 4 или 8 байтов (или даже шире). Это означает, что ЦП не извлекает ни одного байта за раз - он выбирает 4 или 8 байтов, начиная с запрошенного адреса. Вследствие этого 2 или 3 младших значащих бита адреса памяти фактически не отправляются ЦП - внешняя память может считываться или записываться только по адресам, кратным ширине шины. Если бы вы запросили байт по адресу «9», ЦП фактически запросил бы у памяти блок байтов, начинающийся с адреса 8, и загрузил второй в ваш регистр (отбрасывая остальные).

Это означает, что неправильный доступ может потребовать двух чтений из памяти: если вы запрашиваете 8 байтов, начиная с адреса 9, ЦП должен извлечь 8 байтов, начиная с адреса 8, а также 8 байтов начиная с адреса 16, затем замаскируйте нужные вам байты. С другой стороны, если вы запрашиваете 8 байтов, начинающихся с адреса 8, тогда требуется только одна выборка. Некоторые процессоры даже не будут выполнять такую ​​смещенную нагрузку - они просто вызовут исключение (или даже тихо загрузят неправильные данные!).

9 голосов
/ 17 мая 2010

Выравнивание памяти важно для производительности по-разному. Это связано с аппаратной причиной. Начиная с 80-х годов, существует разница во времени доступа между процессором и памятью. Скорость процессора растет быстрее, чем скорость памяти. Эта разница становится все больше и больше со временем (приведу пример: на Apple II частота процессора составляла 1,023 МГц, частота памяти была вдвое больше этой частоты, 1 такт для процессора, 1 такт для видео. Современный ПК работает примерно на 3 ГГц на процессоре, с памятью на 400 МГц). Одним из решений проблемы постоянно замедляющейся памяти является доступ к ней на более широких шинах, вместо того, чтобы обращаться к 1 байту за раз, ЦП будет считывать из памяти слово шириной 64 бита. Это означает, что даже если вы прочитаете 1 байт из памяти, шина доставит целые 64 бита (8-байтовое слово). Память будет иметь эти 8-байтовые блоки по адресу 0, 8, 16, 24, 32, 40 и т. Д., Кратные 8. Если вы обращаетесь, например, к 8-байтовому слову по адресу 4, аппаратное обеспечение должно будет прочитать слово по адресу 0 замаскируйте старшие 4 байта этого слова, затем прочитайте слово по адресу 8, замаскируйте младшую часть этого слова, объедините его с первой половиной и передайте в регистр. Как видите, довольно сложная (а значит, медленная) операция. Это первая причина, по которой человеку нравится выравниваемый доступ к памяти. Я дам другую причину через 2 часа.

5 голосов
/ 17 мая 2010

«Выравнивание байтов по X» означает, что базовый адрес ваших данных должен быть кратным X. Его можно использовать для использования какого-то специального оборудования, например DMA, в каком-то специальном оборудовании, для более быстрого доступа к процессору и т. Д. ..

В случае сотового процессора данные должны быть выровнены на 16 байтов, чтобы их можно было скопировать в / из сопроцессора.

1 голос
/ 22 октября 2014

, если данные памяти выровнены на 8 байтов, это означает:
sizeof(the_data) % 8 == 0.
Как правило, на языке C, если предполагается, что структура выровнена на 8 байтов, ее размер должен умножаться на 8, а если нет, то заполнение требуется вручную или компилятором.некоторые компиляторы предоставляют директивы для выравнивания структуры по n байтов, для VC это #prgama pack(8), а для gcc это __attribute__((aligned(8))).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...