Как размер структуры зависит от типа данных
Я использую 32-битную ОС Linux и компилятор GCC.
Я попытался с тремя различными типами структуры. в первой структуре я определил только один char
переменная. размер этой структуры равен 1, что правильно.
во второй структуре я определил только один int
переменная. здесь размер структуры показывает 4, что тоже правильно.
но в третьей структуре, когда я определил один char
и один int
это означает, что общий размер должен быть 5, но вывод, который он показывает 8. Кто-нибудь может объяснить, как назначается структура?
typedef struct struct_size_tag
{
char c;
//int i;
}struct_size;
int main()
{
printf("Size of structure:%d\n",sizeof(struct_size));
return 0;
}
Выход: Размер структуры:1
typedef struct struct_size_tag
{
//char c;
int i;
}struct_size;
int main()
{
printf("Size of structure:%d\n",sizeof(struct_size));
return 0;
}
Выход: Размер структуры:4
typedef struct struct_size_tag
{
char c;
int i;
}struct_size;
int main()
{
printf("Size of structure:%d\n",sizeof(struct_size));
return 0;
}
Выход:
Размер структуры:8
4 ответа
Разница в размерах обусловлена выравниванием. Компилятор может свободно выбирать байты заполнения, которые делают общий размер структуры не обязательно суммой ее отдельных элементов.
Если заполнение структуры нежелательно, поскольку может потребоваться взаимодействие с некоторыми требованиями к оборудованию (или по другим причинам), компиляторы обычно поддерживают структуры упаковки, поэтому заполнение отключено.
Вы определенно получаете выравнивание структуры данных
"Выравнивание данных означает размещение данных со смещением в памяти, равным некоторому кратному размеру слова, что повышает производительность системы благодаря тому, как процессор обрабатывает память. Для выравнивания данных может потребоваться вставить несколько бессмысленных байтов между конец последней структуры данных и начало следующей, которая является заполнением структуры данных."
Для получения дополнительной информации посмотрите на это, Выравнивание структуры данных
Стандарт C позволяет компилятору добавлять байты заполнения к структурам после любого поля, чтобы обеспечить выравнивание следующего поля в соответствии с любыми конкретными требованиями компилятора (или пользователя компилятора). Стандарт не указывает, но обычно компилятор предоставляет аргумент командной строки для определения выравнивания (по умолчанию). Хорошие компиляторы также неизменно поддерживают стандарт де-факто пакета #pragma, включая параметры push и pop.
Заполняющие байты обеспечивают улучшенную производительность за счет уменьшения количества обращений к памяти, требуемых для соответственно выровненных типов данных. Например, для 32-разрядного процессора (точнее, системы, которая использует память с 32 строками данных) для доступа к 32-разрядному целому числу потребуется два обращения к памяти при чтении и записи значения, а не только один, если он пересекает 4-байтный границы (т. е. если только два нижних бита адреса целого числа не равны нулю).
См. Мой блог для более подробной информации (лучше, чем статья в Википедии).
Волшебное слово - выравнивание / выравнивание в памяти. См. Выравнивание структуры данных.