Размер структуры в 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. И эта область заполнения учитывает размер структуры.

Другие вопросы по тегам