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

Я использую 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-байтный границы (т. е. если только два нижних бита адреса целого числа не равны нулю).

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

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

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