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