2013-04-05 2 views
11

Я читаю N3485 C++ проект стандарта и в разделе о выравнивании, говорится следующее:C++ выравнивание - строгий и слабый

3,11 Alignment [basic.align]

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

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

Ориентировочный указатель, о котором идет речь, это alignas.

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

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

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

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

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

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

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

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

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

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

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

ответ

8

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

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

+0

ах! Это имеет смысл. –

Смежные вопросы