как размер структуры зависит от типа данных

Я использую 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;
}

Выход: Размер структуры: 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

3

Решение

Разница в размерах обусловлена ​​выравниванием. Компилятор может свободно выбирать байты заполнения, которые делают общий размер структуры не обязательно суммой ее отдельных элементов.

Если заполнение структуры нежелательно, поскольку может потребоваться взаимодействие с некоторыми требованиями к оборудованию (или по другим причинам), компиляторы обычно поддерживают структуры упаковки, поэтому заполнение отключено.

3

Другие решения

Вы определенно получаете Выравнивание структуры данных

«Выравнивание данных означает размещение данных со смещением памяти, равным некоторому
кратный размеру слова, что увеличивает производительность системы
из-за того, как процессор обрабатывает память. Чтобы выровнять данные, это может быть
необходимо вставить несколько бессмысленных байтов между концом последнего
структура данных и начало следующего, который является структурой данных
обивка «.

Для получения дополнительной информации посмотрите на это, Выравнивание структуры данных

2

Стандарт C позволяет компилятору добавлять байты заполнения к структурам после любого поля, чтобы обеспечить выравнивание следующего поля в соответствии с любыми конкретными требованиями компилятора (или пользователя компилятора). Стандарт не указывает, но обычно компилятор предоставляет аргумент командной строки для определения выравнивания (по умолчанию). Хорошие компиляторы также неизменно поддерживают стандарт де-факто пакета #pragma, включая параметры push и pop.

Заполняющие байты обеспечивают улучшенную производительность за счет уменьшения количества обращений к памяти, требуемых для соответственно выровненных типов данных. Например, для 32-разрядного процессора (точнее, системы, которая использует память с 32 строками данных) для доступа к 32-разрядному целому числу потребуется два обращения к памяти при чтении и записи значения, а не только один, если он пересекает 4-байтный границы (т. е. если только два нижних бита адреса целого числа не равны нулю).

Увидеть Мой блог для более подробной информации (лучше, чем статья в Википедии).

2

Волшебное слово выравнивание / выравнивание памяти @увидеть выравнивание структуры данных.

1
По вопросам рекламы [email protected]