Подтвердить что ты не робот

Размер структуры в 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

Почему размер структуры не равен сумме размеров отдельных переменных компонента?

4b9b3361

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