Выравнивание структуры по умолчанию для 32-разрядного слова процессора - PullRequest
0 голосов
/ 25 октября 2018

Я работаю со структурой, скомпилированной для 32-битного процессора ARM.

typedef struct structure {
   short a;
   char b;
   double c;
   int d;
   char e;
}structure_t;

Если я ничего не использую, __attribute__ ((aligned (8))) или __attribute__ ((aligned (4))) я получаю те же результаты с точки зрения размера структуры и элементовсмещение.Общий размер равен 24. Поэтому я думаю, что он всегда выравнивается до 8 (смещения для обоих a=0, b=2, c=8, d=16, e=20).

Почему 8выравнивание по умолчанию выбрано компилятором?Разве это не должно быть 4, потому что текстовый процессор 32?

Спасибо заранее, товарищи.

1 Ответ

0 голосов
/ 25 октября 2018

Выровненный атрибут задает только минимальное выравнивание, а не точное.Из документации gcc :

Выровненный атрибут может только увеличить выравнивание;но вы можете уменьшить его, указав также упакованный.

А на вашей платформе естественное выравнивание double равно 8, так что это то, что используется.

Итак, чтобы получить то, что выВы хотите объединить атрибуты aligned и packed.С помощью следующего кода c имеет смещение 4 (проверено с использованием offsetof).

typedef struct structure {
   short a;
   char b;
   __attribute__((aligned(4))) __attribute__((packed)) double c;
   int d;
   char e;
} structure_t;
...