Что означает "память имеет 8 байт выровнено"?
Пройдя один проект, я увидел, что данные памяти "8 байт выровнены". Может кто-нибудь объяснить, что это значит?
Ответы
Ответ 1
Объект, "выравниваемый по 8 байт", хранится по адресу памяти, кратному 8.
Многие ЦП будут загружать только некоторые типы данных из выровненных местоположений; на других ЦП такой доступ выполняется быстрее. Там также есть несколько других возможных причин для использования выравнивания памяти - не видя кода, который трудно сказать, почему.
Выровненный доступ выполняется быстрее, поскольку внешняя шина в память не является одним байтом - она обычно имеет ширину 4 или 8 байтов (или даже шире). Это означает, что CPU не извлекает один байт за раз - он извлекает 4 или 8 байтов, начиная с запрошенного адреса. Вследствие этого 2 или 3 младших бита адреса памяти фактически не отправляются ЦП - внешняя память может быть прочитана или записана только по адресам, которые кратно ширине шины. Если вы запросили байт по адресу "9", CPU фактически запросит память для блока байтов, начинающихся с адреса 8, и загрузит второй в ваш регистр (отбрасывая остальные).
Это означает, что для несогласованного доступа может потребоваться два чтения из памяти: если вы запрашиваете 8 байтов, начинающихся с адреса 9, CPU должен получить 8 байтов, начинающихся с адреса 8, а также 8 байтов, начинающихся с адреса 16, тогда замаскируйте нужные вам байты. С другой стороны, если вы запрашиваете 8 байтов, начинающихся с адреса 8, то требуется только одна выборка. Некоторые процессоры даже не будут выполнять такую несогласованную нагрузку - они просто поднимут исключение (или даже тихо загружают неправильные данные!).
Ответ 2
Выравнивание памяти важно для производительности по-разному. У этого есть причина, связанная с оборудованием. С 80-х годов существует разница в времени доступа между ЦП и памятью. Скорость процессора растет быстрее, чем скорость памяти. Эта разница становится все больше и больше с течением времени (чтобы привести пример: на Apple II процессор находился на 1,023 МГц, память была вдвое больше, 1 цикл для CPU, 1 цикл для видео. примерно на 3 гц на процессоре, с памятью на уровне 400 МГц). Одним из решений проблемы когда-либо замедляющейся памяти является доступ к ней на все более широких шинах вместо того, чтобы обращаться к 1 байту за раз, процессор будет читать 64-битное слово из памяти. Это означает, что даже если вы читаете 1 байт из памяти, шина будет поставлять целое 64-битное (8-байтное слово). Память будет иметь эти 8-байтовые единицы по адресам 0, 8, 16, 24, 32, 40 и т.д. Множество 8. Если вы получаете доступ, например 8-байтовое слово по адресу 4, аппаратное обеспечение должно будет прочитать слово по адресу 0, замаскируйте высокие 4 байта этого слова, затем прочитайте слово по адресу 8, замаскируйте низкую часть этого слова, объедините его с первой половиной и отдайте это регистру. Как вы видите довольно сложную (таким образом, медленную) операцию. Это первая причина, по которой вам нравится доступ к выделенной памяти. Я дам еще одну причину через 2 часа.
Ответ 3
"X bytes aligned" означает, что базовый адрес ваших данных должен быть кратным X. Он может использоваться для использования некоторого специального оборудования, такого как DMA, в некоторых специальных аппаратных средствах, для быстрого доступа к процессору и т.д...
Это процессор Cell Processor, где данные должны быть выровнены по 16 байт для копирования в/из сопроцессора.
Ответ 4
если данные памяти совпадают с 8 байтами, это означает:
sizeof(the_data) % 8 == 0
. Как правило, на языке C, если предлагается, чтобы структура была выровнена по 8 байт, ее размер должен быть умножен на 8, а если нет, заполнение требуется вручную или компилятором. некоторые компиляторы предоставляют директивы для создания структуры, выровненной с n байтами, для VC она #prgama pack(8)
, а для gcc - __attribute__((aligned(8)))
.