Как я могу выровнять элемент структуры? - PullRequest
1 голос
/ 26 марта 2010

Есть ли способ заставить выравнивание определенного элемента структуры с помощью GNUism?

Ответы [ 4 ]

3 голосов
/ 26 марта 2010

http://gcc.gnu.org/onlinedocs/gcc-3.1.1/gcc/Type-Attributes.html

aligned (alignment)
This attribute specifies a minimum alignment (in bytes) for variables of the specified type. > For example, the declarations:
        struct S { short f[3]; } __attribute__ ((aligned (8)));
        typedef int more_aligned_int __attribute__ ((aligned (8)));
3 голосов
/ 26 марта 2010

Try 6.54.8 Pragmas для структурной упаковки

Для совместимости с Microsoft Компиляторы Windows, GCC поддерживает множество директив #pragma, которые изменяют максимальное выравнивание членов структуры (кроме нулевой ширины битовые поля), союзы и классы впоследствии определено. Значение n ниже всегда требуется быть маленьким Степень двойки и определяет новый выравнивание в байтах.

  1. #pragma pack(n) просто устанавливает новое выравнивание.
  2. #pragma pack() устанавливает выравнивание на тот, который был в эффект при запуске компиляции (см. также опция командной строки -fpack-struct[=<n>] см. Параметры кода поколения).
  3. #pragma pack(push[,n]) выдвигает текущую настройку выравнивания на внутренний стек, а затем по желанию устанавливает новое выравнивание.
  4. #pragma pack(pop) восстанавливает настройку выравнивания, сохраненную в вершина внутреннего стека (и удаляет эту запись стека). Обратите внимание, что #pragma pack([n]) не влияет на этот внутренний стек; таким образом это можно иметь #pragma pack(push) с последующим кратным #pragma pack(n) экземпляры и завершены одним #pragma pack(pop).

Некоторые цели, например i386 и powerpc, поддержка ms_struct #pragma, которая излагает структуру как документально __attribute__ ((ms_struct)).

  1. #pragma ms_struct on включает макет для объявленных структур.
  2. #pragma ms_struct off отключает макет для объявленных структур.
  3. #pragma ms_struct reset возвращается к макету по умолчанию.
0 голосов
/ 26 марта 2010

В дополнение к перечисленным вещам вас также может заинтересовать атрибут ((упакованный)), который пытается выложить данные без каких-либо дополнений - по существу, с выравниванием, установленным на 1. Это полезно при разметке макета данных в файле или сетевом протоколе, где байты заполнения должны просто исчезнуть.

0 голосов
/ 26 марта 2010

Вы можете попробовать выровнять атрибут по структуре:

__attribute__((__aligned__(8)))
...