Можно ли ... изменить текущую настройку выравнивания структуры в gcc / g ++?
Да. G CC Прагмы и параметры командной строки описаны в документации G CC.
Существует параметр командной строки:
-fpack-struct[=n]
Без указания значения, упаковать все элементы конструкции вместе без отверстий. Если указано значение (которое должно быть небольшой степенью двух), упакуйте элементы структуры в соответствии с этим значением, представляющим максимальное выравнивание (то есть объекты с требованиями выравнивания по умолчанию, превышающими это, выводятся потенциально невыровненными в следующем месте подгонки.
Предупреждение: ключ -fpack-struct заставляет G CC генерировать код, который не совместим двоично с кодом, сгенерированным без этого переключателя. Кроме того, он делает код неоптимальным. Используйте его для соответствия двоичный интерфейс приложения не по умолчанию.
И прагмы:
Для совместимости с компиляторами Microsoft Windows, G CC поддерживает набор # директивы прагмы, которые изменяют максимальное выравнивание элементов структур (кроме битовых полей нулевой ширины), объединений и классов, определенных впоследствии. Значение n ниже всегда должно быть небольшой степенью двойки и задает новое выравнивание в байтах.
#pragma pack(n)
просто устанавливает новое выравнивание. * 10 25 * #pragma pack()
устанавливает выравнивание на то, которое действовало при запуске компиляции (см. Также параметр командной строки -fpack-struct [=], см. Опции Code Gen). #pragma pack(push[,n])
pushes текущая настройка выравнивания во внутреннем стеке, а затем при необходимости устанавливает новое выравнивание. #pragma pack(pop)
восстанавливает настройку выравнивания до значения, сохраненного в верхней части внутреннего стека (и удаляет эту запись в стеке). Обратите внимание, что # pragma pack([n])
не влияет на этот внутренний стек; таким образом, можно иметь #pragma pack(push)
, за которым следуют несколько #pragma pack(n)
экземпляров и завершать их одним #pragma pack(pop)
.
Некоторые цели, например, i386 и powerp c, поддерживают ms_struct #pragma, которая представляет структуру в виде документированных __attribute__ ((ms_struct))
.
#pragma ms_struct on
поворотов в макете для объявленных структур. #pragma ms_struct off
отключает макет для объявленных структур. #pragma ms_struct reset
возвращается к макету по умолчанию.
Можно ли обнаружить ... текущую настройку выравнивания структуры в gcc / g ++?
Многое зависит от того, что вы подразумеваете под "обнаруживать". Существует следующая опция командной строки:
-frecord-gcc-switches
Этот переключатель заставляет командную строку, которая использовалась для вызова компилятора, записываться в создаваемый объектный файл. Этот переключатель реализован только для некоторых целей, и точный формат записи зависит от целевого и двоичного формата файла, но обычно он принимает форму раздела, содержащего текст ASCII.
Если такая опция использовалась , затем вы можете определить, использовался ли -fpack-struct [= n], проверив двоичный файл.
Если вы просто хотите узнать выравнивание определенного типа, вы можете использовать alignof
оператор. Если вы хотите узнать максимальное выравнивание любого скалярного типа, вы можете использовать alignof(std::max_align_t)
. Вы можете указать классы или массивы для более строгого выравнивания, чем они были бы с alignas
. Если это превышает выравнивание std::max_align_t
, то класс считается выровненным.