Размер структуры в C
Возможный дубликат:
Почему isn & rsquo; t 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
Почему размер структуры не равен сумме размеров отдельных переменных компонента?
Ответы
Ответ 1
Компилятор может добавлять дополнение для требований к выравниванию. Обратите внимание, что это относится не только к заполнению между полями структуры, но также может применяться к концу структуры (так что массивы типа структуры будут правильно выровнены по каждому элементу).
Например:
struct foo_t {
int x;
char c;
};
Несмотря на то, что в поле c
не требуется заполнение, структура обычно имеет sizeof(struct foo_t) == 8
(в 32-битной системе - скорее, систему с 32-разрядным типом int
), потому что потребуется должно быть 3 байта заполнения после поля c
.
Обратите внимание, что отступы могут не требоваться системой (например, x86 или Cortex M3), но компиляторы могут по-прежнему добавлять ее по соображениям производительности.
Ответ 2
Как уже упоминалось, компилятор C добавит дополнение для требований к выравниванию. Эти требования часто связаны с подсистемой памяти. Некоторые типы компьютеров могут получать доступ только к памяти, выстроенной до некоторого "хорошего" значения, например 4 байта. Это часто совпадает с длиной слова. Таким образом, компилятор C может выравнивать поля в вашей структуре с этим значением, чтобы упростить их доступ (например, 4 байтовых значения должны быть выровнены по 4 байт). Кроме того, он может вставить нижнюю часть структуры для выстраивания в линию данных, которые следуют структуре, Я считаю, что есть и другие причины. Более подробную информацию можно найти на странице этой страницы wikipedia.
Ответ 3
По умолчанию выравнивание по умолчанию - 4 байта. Либо 30-байтовый элемент получил 32, либо структура в целом была округлена до следующего 4-байтового интервала.
Ответ 4
Выравнивание до 6 байтов не является странным, поскольку оно соответствует адресам, кратным 4.
Итак, в основном у вас есть 34 байта в вашей структуре, и следующая структура должна быть помещена на адрес, который является кратным 4. Ближайшее значение после 34 равно 36. И эта область заполнения учитывается в размере структуры.