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