Структура заполнения - PullRequest
2 голосов
/ 18 января 2012

Я пытался понять, почему заполнение структур является причиной того, что структуры не могут сравниваться с помощью memcmp. Одна маленькая вещь, которую я не понимаю, о заполнении структуры это ... почему "a short be 2 byte aligned" или "a long be 4 byte aligned". Я понимаю, что это с их размерами, но почему они не могут появляться на границе байтов?

Или другими словами "why is 0x10004566 not a valid location for a long variable but 0x10004568 is?"

Ответы [ 3 ]

4 голосов
/ 18 января 2012

Потому что некоторые платформы (то есть процессоры) физически не поддерживают «неправильный» доступ к памяти. Другие платформы поддерживают их, но гораздо медленнее.

Заполнение, которое вы получаете в структуре, зависит от выбора, который делает ваш компилятор, но он будет делать эти выборы, чтобы удовлетворить специфические требования к процессору, на который ориентирован код.

3 голосов
/ 18 января 2012

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

Ограничение доступа к памяти с выравниванием и без выравнивания исходит непосредственно от оборудования, используемого для извлеченияданные из памяти, которые обычно извлекают их кусками, размер которых равен машинному слову.Скажем, вы хотите получить доступ к двойному слову (4 байта), хранящемуся в местоположении 101. Это означает, что контроллер памяти сначала должен (вероятно) выполнить чтение двойного слова в местоположении 100, затем еще одно чтение двойного слова в местоположении 104, изатем объедините отдельные байты из местоположений 101, 102, 103 и 104 вместе.Вся операция занимает (гипотетически) два такта.

Если вы хотите получить доступ к двойному слову в местоположении 100, такой проблемы не существует, что должно быть достаточно четко проиллюстрировано на примере, который я предоставил.

На самом деле доступ к смещенным данным является такой большой проблемой, что инструкции SSE («выровненные» версии, есть также «выровненные» версии, которые этого не делают) вызовут общую ошибку защиты, если вы попытаетесь получить доступ к смещенным данным с помощьюте.

Как правило, никогда не повредит выровнять 4-байтовые данные на 4-байтовой границе, 8-байтовые данные на 8-байтовой границе и т. д.

1 голос
/ 18 января 2012

Единственный дополнительный пример, который я могу придумать в отношении выравнивания, - это передача данных, передача данных (в зависимости от архитектуры) идет, например, по 32 байта, если ваши данные пересекают границу, это может потребовать 2 передачи.получить данные, а не 1.

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