Подтвердить что ты не робот

С++ выравнивание - строгий и слабый

Я читаю N3485 С++ Standard Draft и в разделе о выравнивании он указывает следующее:

3.11 Выравнивание [basic.align]

1... Выравнивание представляет собой целочисленное значение, определенное реализацией, представляющее количество байтов между последовательными адресами, на которых может быть выделен данный объект. Тип объекта налагает требование выравнивания для каждого объекта этого типа; более строгое выравнивание можно запросить с помощью спецификатора выравнивания (7.6.2).

Здесь он указывает, что такое выравнивание, и я получаю это. Это означает, что если у вас есть 32-битная (4-байтная) система, она будет читать в 4-х байтовых размерах за раз, поэтому вы должны размещать вещи в памяти на 4 байтовых смещенных адресах. Многие из них обрабатываются хорошим компилятором, однако С++ позволяет вам также говорить об этом.

Указатель выравнивания, о котором он говорит, равен alignas.

Вы можете передать целое число в alignas, чтобы указать требование выравнивания или тип, например alignas(double)

Теперь у вас слабое или строчное выравнивание, которое указано как следующее:

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

7 Сравнение выравниваний имеет смысл и дает очевидные результаты:

- Два выравнивания равны, когда их числовые значения равны.

- Два выравнивания отличаются друг от друга, когда их числовые значения не равны.

- Если выравнивание больше другого, оно представляет собой более строчное выравнивание.

Итак, здесь указано, что более строгое выравнивание - это большее выравнивание. Означает ли это, что alignas(8) более строг, чем alignas(4)? В 32-битной (4-байтовой) системе версия 8 будет означать, что для типа int потребуется два чтения вместо одного, а одно с просто отступом. Является ли строгое указание на то, что он налагает потенциальные накладные расходы на CPU, когда выравнивание "неправильно используется", как в этом глупом примере?

Я понимаю, что не все выравнивания действительны для данной системы и что расширенные выравнивания должны быть действительными, чтобы обеспечить правильное поведение.

Для меня выравнивание состоит в том, чтобы позволить ЦП получить доступ к данным памяти в блоках размера слова, что является наиболее оптимальным способом для ЦП для извлечения и записи данных в память и из памяти.

Это строгое выравнивание, как я понимаю, потенциально может испортить это. Я ошибаюсь? Что такое строгое выравнивание против слабого выравнивания?

4b9b3361

Ответ 1

"Строгий" просто ссылается на тот факт, что более крупные значения выравнивания являются более ограничительными с точки зрения возможных адресов.

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