2016-04-27 5 views
0

Я столкнулся с этой страницей The Lost Art of C Structure Packing, и, хотя мне никогда не приходилось заполнять какие-либо структуры, я хотел бы узнать немного больше, чтобы когда/если мне тоже нужно - я могу.Где можно найти требования к выравниванию для любого произвольного компилятора?

Он говорит:

для хранения основных типов данных C на x86 или ARM процессор обычно не начинаются в произвольных байтовых адресов в памяти. Скорее, каждый тип, кроме char, имеет требование выравнивания; символы могут начинаться с любого байтового адреса, но 2-байтовые шорты должны начинаться с четного адреса, 4-байтовые int или float должны начинаться по адресу, делящемуся на 4, а 8-байтные длинные или удвоенные значения должны начинаться по адресу, делящемуся на 8 Подписанный или неподписанный не имеет значения.

Означает ли это, что все 32-разрядные процессоры (x86, ARM, AVR32, PIC32, ...) имеют это требование выравнивания? Что относительно 16-разрядных процессоров?

Если нет, и это конкретный аппарат, где я могу найти эту информацию? Я пытался искать через Microchip XC16 Manual, но я не мог найти требование к выравниванию, которые говорят, что Интс начинаются с адресом, кратных 4.

Я предполагаю, что информация есть, и я не ищу правильные ключевые слова - что «требование выравнивания», если я буду искать в Интернете для получения дополнительной информации?

+2

Вопрос о «всем аппаратном обеспечении, прошлом, будущем, спекулятивном», довольно сложно ответить. –

+0

@KerrekSB Суть того, что я прошу, это действительно, где я могу найти информацию для любого устройства, если все 32-разрядные процессоры arent совпадают. Это в руководстве? Если да, то каковы правильные термины или терминология для поиска и где? Это ясно? – efox29

+0

Довольно сложно? Я ручался бы за невозможность. Это зависит от оборудования и реализации. x86, например, разрешает любые произвольно выровненные чтения/записи, компилятор может делать все, что ему нравится. ARM, с другой стороны, не допускает произвольно выровненных доступов. – Leandros

ответ

1

требование Трассы имеет 2 соображения: требуется, предпочтительный

Требуется: Пример: некоторые платформы требуют различных типов, подобно int быть выровнены. Перемещенный код, который пытается получить доступ к int на границе без выравнивания, приводит к ошибке. Компиляторы обычно автоматически выравнивают данные, чтобы предотвратить эту проблему.

Эффективность: Несогласованные обращения могут быть разрешены, но в результате получается более медленный код. Многие компиляторы, вместо того, чтобы упаковывать данные, будут по умолчанию выровнять данные для скорости эффективности. Как правило, такие компиляторы разрешают компилятору конкретное ключевое слово или параметр компилятора pack данные вместо пространство эффективность.

Эти проблемы относятся к различным процессорам разного размера в разной степени. 8-разрядный процессор может иметь 16-битную шину данных и обязать использовать 16+ -битные типы. У совместимого компилятора C для 64-битного процессора может быть только только имеют 64-битные типы, даже char. Возможности огромны.


С обеспечивает целочисленный тип max_align_t в <stddef.h>. Это может быть использовано различными способами для определения минимального общего требования к выравниванию.

... max_align_t который является типом объекта которого выравнивание так велик, как при поддержке реализации в всех контекстов; ... C11 §7.19 2

C также имеет _Alignas(), чтобы наложить более строгое выравнивание переменной.

0

Здесь есть два глобальных ответа.Да, у всех процессоров есть штраф за выравнивание (ARM, MIPS, x86 и т. Д.). Нет, вы не можете определить по типу. Все ARM не имеют одного и того же штрафа за выравнивание, несмотря на то, что люди думают, что знают о старых ARMv4 и ARMv5, вы можете делать неприсоединившиеся обращения предсказуемым образом, что предсказуемый способ был не тем, что большинство из нас предпочло бы, и вы должны включите его. MIPS и ARM и, возможно, другие в какой-то момент будут иметь суровое наказание за непереведенные передачи, вы получите ошибку данных. Но из-за характера программирования программистов и т. Д. По умолчанию для ARM по умолчанию должно быть отключено на некоторых/более новых ядрах. Вы можете отключить его или включить его независимо от того, какой вы хотите.

ВСЕ процессоры имеют штраф за невыложенные передачи, штраф за исполнение, и эти удары происходят на разных уровнях, иногда в ядре, на краю ядра, на каждом уровне кеша и на внешнем слое ram , Поскольку проекты меняются настолько широко, вы не можете создать единое правило.

Точно так же, поскольку выравнивание в компиляторах определяется реализацией, вы не можете писать переносимый код. Поэтому, если вы имеете дело с процессором (вероятно, с ARM, так как это происходит, когда большинство людей укушены), которые имеют несогласованные ошибки, самым портативным решением, но не надежным, является запуск ваших структур с помощью 64-битных переменных, тогда 32 затем 16, а затем 8. Компиляторы, как правило, размещают вещи в том порядке, в котором вы их определили, до тех пор, пока вся структура начинается с правой границы для этой цели, тогда переменные будут попадать в выравнивание должным образом, без необходимости заполнения. Глобального решения проблемы не существует, кроме того, что вы не используете структуры, или отключите проверку выравнивания и не пострадали от ударов производительности переднего конца.

Обратите внимание, что 32-разрядные рычаги, с которыми мы обычно сталкиваемся сегодня, используют 64-битную шину AMBA/AXI не 32, они все еще могут проверять все выравнивания (16, 32, 64) для передач, если они включены, но неравномерная производительность по крайней мере, на уровне AMBA/AXI не ударяйте вас, если вы не пересечете границу с 64-разрядной выровненностью. Возможно, у вас все еще есть дополнительный кеш-код, хотя это маловероятно, если у вас нет удара AMBA/AXI.

+0

« Да, все процессоры имеют штраф за выравнивание что-то вроде «Это неверно, так как подавляющее большинство всех 8-битных микроконтроллеров по каким-либо причинам не имеют никаких санкций за выравнивание. И есть много 16-битных, которые тоже не являются. – Lundin

+0

справедливо, если возможные переходы больше размера автобусов, или выравнивание может подтолкнуть вас к нескольким циклам для одной передачи, тогда есть штраф. Да, есть 8 бит и около 16 с без штрафа из-за выравнивания. –