Какие значения являются допустимыми значениями n в директиве #pragma pack(n)?
Я сделал гугл и обнаружил, что n = 1,2,4,8 - единственные допустимые аргументы для директивы препроцессора.
#pragma pack(n)
.
Может кто-нибудь сказать мне, пожалуйста, что не так со значениями, отличными от вышеупомянутых значений? (например, n =3,5 и т. д., почему неверно)?
Являются ли указанные выше значения единственными значениями, которые можно использовать в качестве аргумента?
Как берутся значения n и почему?
Я использую компилятор GCC.
1 ответ
Вот три причины, по которым выравнивание должно быть малой степенью двойки.
В документации GCC сказано следующее: значение пакета «всегда должно быть небольшим числом, кратным двум».
В C 2018 6.2.5 4 говорится, что выравнивание должно быть степенью двойки: «Каждое действительное значение выравнивания должно быть неотрицательной интегральной степенью двойки». В предложении есть дополнительный текст о максимальном выравнивании (таким образом, ограничивая его малой степенью двойки), но он гибкий.
Память адресована и организована с использованием двоичного кода. При извлечении данных из памяти используются адресные биты для активации частей в устройствах памяти и для выбора байтов в словах или других группах байтов. Таким образом, границы выравнивания между группировками расположены там, где меняются младшие биты. Это означает, что младшие биты адреса n для первого байта новой группы являются нулями, поэтому адрес кратен 2n.