Это зависит от архитектуры и компилятора. В этом конкретном случае вы должны быть в безопасности, но посмотрите Заполнение структуры данных .
Типичное выравнивание структур C на x86
Элементы структуры данных хранятся
последовательно в памяти, так что в
структура ниже члена Data1
всегда будет предшествовать Data2 и Data2
всегда будет предшествовать Data3:
struct MyData
{
short Data1;
short Data2;
short Data3;
};
Если тип «короткий» хранится в двух
байтов памяти, то каждый член
структура данных изображена выше
будет выровнен по 2 байта. Data1 будет
быть со смещением 0, данные 2 со смещением 2 и
Данные3 по смещению 4. Размер этого
структура будет 6 байтов.
Тип каждого члена
структура обычно имеет значение по умолчанию
выравнивание, означающее, что это будет,
если иное не требуется
программист, выровняйте на
заранее определенная граница. Следующие
типичные выравнивания действительны для
компиляторы от Microsoft, Borland и
GNU при компиляции для 32-битного x86:
- Символ (один байт) будет выровнен на 1 байт.
- Короткий (два байта) будет выровнен по 2 байта.
- Int (четыре байта) будет выровнен по 4 байта.
- Число с плавающей запятой (четыре байта) будет выровнено по 4 байта.
- Двойной (восемь байтов) будет выровнен по 8 байтов в Windows и 4 по байту в Linux.
Вот структура с членами
различные типы, до 8 байт
сборник:
struct MixedData
{
char Data1;
short Data2;
int Data3;
char Data4;
};
После компиляции структуры данных
будет дополнен прокладкой
байты, чтобы обеспечить правильное выравнивание для
каждый из его членов:
struct MixedData /* after compilation */
{
char Data1;
char Padding0[1]; /* For the following 'short' to be aligned on a 2 byte boundary */
short Data2;
int Data3;
char Data4;
char Padding1[3];
};
Скомпилированный размер структуры
сейчас 12 байтов. Важно отметить
что последний член дополняется
количество байтов, необходимое для
соответствовать наибольшему типу
состав. В этом случае 3 байта
добавлен в последний член, чтобы дополнить
структура до размера длинного слова.
Можно изменить выравнивание
структур, чтобы уменьшить память
они требуют (или соответствуют
существующий формат) путем изменения
выравнивание компилятором (или «упаковка»)
члены структуры.
Запрос, что MixedData
Структура выше должна быть выровнена к одному
граница байта будет иметь компилятор
отменить заранее установленное выравнивание
членов и нет байтов заполнения
будет вставлен.
Пока не существует стандартного способа
определение выравнивания структуры
члены, некоторые компиляторы используют #pragma
директивы для указания упаковки внутри
исходные файлы. Вот пример:
#pragma pack(push) /* push current alignment to stack */
#pragma pack(1) /* set alignment to 1 byte boundary */
struct MyPackedData
{
char Data1;
long Data2;
char Data3;
};
#pragma pack(pop) /* restore original alignment from stack */
Эта структура будет иметь скомпилированный
размер 6 байт. Вышеуказанные директивы
доступны в компиляторах от
Microsoft, Borland, GNU и многие другие
др.