«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему sizeof(myStruct) возвращает 6 байт вместо 8 байт для структуры с тремя беззнаковыми короткими членами?

Почему sizeof(myStruct) возвращает 6 байт вместо 8 байт для структуры с тремя беззнаковыми короткими членами?

Опубликовано 18 ноября 2024 г.
Просматривать:820

Why does `sizeof(myStruct)` return 6 bytes instead of 8 bytes for a struct with three `unsigned short` members?

Выравнивание памяти в структурах C: понимание несоответствия размеров

При работе со структурами C выравнивание памяти играет решающую роль в определении фактического размер структуры в памяти. Выравнивание памяти означает размещение структур данных по адресам памяти, которые делятся на определенные границы. Это обеспечивает эффективный доступ к данным и оптимизацию производительности.

Рассмотрим 32-разрядную машину, где выравнивание памяти обычно установлено на 4 байта. В этом контексте структура, состоящая из нескольких коротких членов без знака, например:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;

Можно было бы ожидать, что размер памяти этой структуры составит 8 байт (3 x 2 байта). Однако оператор sizeof(myStruct) возвращает только 6 байт. Это несоответствие можно объяснить требованием выравнивания.

В первом примере каждый короткий элемент занимает 2 байта. Поскольку граница выравнивания составляет 4 байта, между элементами не вставляется заполнение. Таким образом, общий размер остается равным 6 байтам.

Напротив, введение в структуру члена int, как показано ниже, изменяет поведение выравнивания:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;

В этом случае для члена int требуется 4-байтовая граница выравнивания. Чтобы обеспечить выполнение этого требования, между последним коротким элементом без знака (v3) и целым элементом (i) вставляются 2 байта заполнения. В результате общий размер составляет 12 байт (6 байт данных в Shorts, 2 байта заполнения и 4 байта данных в int).

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

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3