Какие значения являются допустимыми значениями n в директиве #pragma pack(n)?

Я сделал гугл и обнаружил, что n = 1,2,4,8 - единственные допустимые аргументы для директивы препроцессора. #pragma pack(n).

Может кто-нибудь сказать мне, пожалуйста, что не так со значениями, отличными от вышеупомянутых значений? (например, n =3,5 и т. д., почему неверно)?

Являются ли указанные выше значения единственными значениями, которые можно использовать в качестве аргумента?

Как берутся значения n и почему?

Я использую компилятор GCC.

1 ответ

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

  1. В документации GCC сказано следующее: значение пакета «всегда должно быть небольшим числом, кратным двум».

  2. В C 2018 6.2.5 4 говорится, что выравнивание должно быть степенью двойки: «Каждое действительное значение выравнивания должно быть неотрицательной интегральной степенью двойки». В предложении есть дополнительный текст о максимальном выравнивании (таким образом, ограничивая его малой степенью двойки), но он гибкий.

  3. Память адресована и организована с использованием двоичного кода. При извлечении данных из памяти используются адресные биты для активации частей в устройствах памяти и для выбора байтов в словах или других группах байтов. Таким образом, границы выравнивания между группировками расположены там, где меняются младшие биты. Это означает, что младшие биты адреса n для первого байта новой группы являются нулями, поэтому адрес кратен 2n.

Другие вопросы по тегам