Размер структуры в C
Возможный дубликат:
Почему sizeof для структуры не равен сумме sizeof каждого члена?
Рассмотрим следующий код C:
#include <stdio.h>
struct employee
{
int id;
char name[30];
};
int main()
{
struct employee e1;
printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1));
return(0);
}
Выход:
4 30 36
Почему размер структуры не равен сумме размеров ее отдельных компонентных переменных?
4 ответа
Компилятор может добавить отступы для требований выравнивания. Обратите внимание, что это относится не только к заполнению между полями структуры, но также может применяться к концу структуры (чтобы массивы типа структуры правильно выравнивали каждый элемент).
Например:
struct foo_t {
int x;
char c;
};
Хотя c
поле не нуждается в заполнении, структура обычно имеет sizeof(struct foo_t) == 8
(в 32-битной системе - скорее система с 32-битной int
тип), поскольку после заполнения должно быть 3 байта c
поле.
Обратите внимание, что заполнение может не требоваться системой (например, x86 или Cortex M3), но компиляторы могут по-прежнему добавлять его по соображениям производительности.
Как уже упоминалось, компилятор C добавит отступы для требований выравнивания. Эти требования часто связаны с подсистемой памяти. Некоторые типы компьютеров могут получить доступ только к памяти, выстроенной до некоторого "хорошего" значения, такого как 4 байта. Это часто совпадает с длиной слова. Таким образом, компилятор C может выровнять поля в вашей структуре по этому значению, чтобы сделать их более доступными (например, 4-байтовые значения должны быть выровнены по 4 байта). Кроме того, он может заполнить нижнюю часть структуры, чтобы выровнять данные, которые следуют за структурой, Я считаю, что есть и другие причины. Больше информации можно найти на этой странице википедии.
Ваше выравнивание по умолчанию, вероятно, составляет 4 байта. Либо 30-байтовый элемент получил 32, либо структура была округлена до следующего 4-байтового интервала.
Выравнивание до 6 байтов не странно, потому что это выравнивание по адресам, кратным 4.
Таким образом, в основном у вас есть 34 байта в вашей структуре, и следующая структура должна быть размещена по адресу, кратному 4. Ближайшее значение после 34 - 36. И эта область заполнения учитывает размер структуры.