Простите мне, если Вы чувствуете, что этому ответили на многочисленные времена, но мне нужны ответы на следующие запросы!
Почему данные должны быть выровненные (на 2-байтовых / 4 байтах / 8 байтах границах)? Здесь мое сомнение состоит в том, когда ЦП имеет Топор Топора строк адреса 1 Топор 2... A2 A1 A0 затем довольно возможно обратиться к ячейкам памяти последовательно. Итак, почему существует потребность выровнять данные на определенных границах?
Как найти требования выравнивания, когда я компилирую свой код и генерирую исполняемый файл?
Если для, например, выравнивание данных 4-байтовая граница, которая означает, что каждый последовательный байт расположен при 4 смещениях по модулю? Мое сомнение состоит в том, если данные - 4 байта, выровненные, который означает, что, если байт в 1 004 затем, следующий байт в 1 008 (или в 1 005)?
Процессоры ориентированы на слова, а не на байты. В простых процессорах память обычно конфигурируется для возврата одного слова (32 бита, 64 бита и т.д.) на стробирование адреса, где нижние две (или более) адресные линии обычно являются битами "неважно".
Процессоры Intel могут выполнять доступ к неслововым границам для многих инструкций, однако это приводит к снижению производительности, поскольку для загрузки одного слова процессор выполняет два обращения к памяти и математическую операцию. Если вы выполняете чтение байтов, выравнивание не применяется.
Некоторые процессоры (ARM или SSE-инструкции Intel) требуют выровненной памяти и имеют неопределенную работу при не выровненном доступе (или выбрасывают исключение). Они экономят значительное пространство кремния, не реализуя гораздо более сложную подсистему загрузки/хранения.
Выравнивание зависит от размера слова процессора (16, 32, 64 бита) или, в случае SSE, от размера регистра SSE (128 бит).
Что касается вашего последнего вопроса, если вы загружаете один байт данных за раз, то в большинстве процессоров нет ограничений на выравнивание (некоторые DSP не имеют инструкций уровня байта, но, скорее всего, вы с этим не столкнетесь).
1.) Некоторые архитектуры вообще не имеют этого требования, некоторые поощряют выравнивание (есть снижение скорости при доступе к элементам данных без выравнивания), а некоторые могут строго соблюдать его (причины несовпадения исключение процессора).
Многие из популярных сегодня архитектур попадают в категорию штрафов за скорость. Разработчикам ЦП пришлось найти компромисс между гибкостью / производительностью и стоимостью (площадь кремния / количество управляющих сигналов, необходимых для циклов шины).
2.) Какой язык, какая архитектура? Проконсультируйтесь с руководством к вашему компилятору и / или с документацией по архитектуре ЦП.
3.) Опять же, это полностью зависит от архитектуры (некоторые архитектуры могут вообще не разрешать доступ к элементам байтового размера или иметь ширину шины, которая даже не кратна 8 битам). Так что, если вы не спросите о конкретной архитектуре, вы не получите никаких полезных ответов.
Очень мало данных «нужно» выровнять. Более того, определенные типы данных могут работать лучше или определенные операции процессора требуют определенного выравнивания данных.
Прежде всего, предположим, что вы читаете 4 байта данных за раз. Предположим также, что ваш процессор имеет 32-битную шину данных. Предположим также, что ваши данные хранятся в байте 2 в системной памяти.
Теперь, когда вы можете загрузить 4 байта данных одновременно, не имеет особого смысла иметь адресный регистр, указывающий на один байт. Сделав адресный регистр точкой на каждые 4 байта, вы можете манипулировать данными в 4 раза. Другими словами, ваш ЦП может читать данные только начиная с байтов 0, 4, 8, 12, 16 и т. Д.
Итак, вот в чем проблема. Если вы хотите, чтобы данные начинались с байта 2, и вы читаете 4 байта, тогда половина ваших данных будет в позиции адреса 0, а другая половина - в позиции 1.
Таким образом, в конечном итоге вы дважды попадете в память, чтобы прочтите свой один 4-байтовый элемент данных. Некоторые процессоры не поддерживают такого рода операции (или заставляют вас загружать и объединять два результата вручную).
Для получения дополнительных сведений перейдите сюда: http://en.wikipedia.org/wiki/Data_structure_alignment
В общем, один ответ на все три вопроса - «это зависит от вашей системы». Еще несколько подробностей:
Ваша система памяти может не иметь побайтной адресации. Кроме того, вы можете столкнуться с потерей производительности, если ваш процессор будет иметь доступ к невыровненным данным.Некоторые процессоры (например, старые чипы ARM) просто не могут этого сделать.
Прочтите руководство для вашего процессора и какую бы спецификацию ABI вы ни создавали,
Обычно, когда люди ссылаются на данные, имеющие определенное выравнивание, это относится только к первому байту. Таким образом, если в спецификации ABI сказано, что «структура данных X должна быть выровнена по 4 байта», это означает, что X должен быть помещен в память по адресу, который делится на 4. Это положение ничего не подразумевает о размере или внутреннем расположении структуры X .
Что касается вашего конкретного примера, если данные выровнены по 4 байта, начиная с адреса 1004, следующий байт будет с адреса 1005.