sizeof c struct только с полями char

Я понимаю, как работает padding. Я знаю, что такое выравнивание. Что для меня странно, так это то, что размер структуры только с полями char не выровнен по 4 байта (заполнение в конце)? Я подозреваю, что это просто не гарантируется спецификацией, поэтому компилятор этого не делает. Если это так, могу ли я получить ссылку на такое правило? В основном меня интересуют архитектуры x86 и x86-64.

Пример:

struct foo {
    char field1;
    char field2;
    char field3;
} foo2;

int main(void)
{
    printf("sizeof=%lu\n", sizeof foo2);
}

выход: sizeof=3

1 ответ

Решение

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

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

Другими словами, если вы поместите две из этих структур рядом друг с другом, ни одно поле ни в одной структуре не нарушит требование выравнивания.

Сравните это с:

struct moreComplexCase {
    char char1WithAlignment1;
    // 3 byte gap to align below item.
    unint32_t uintWithAlignment4;
    char char2WithAlignment1;
    // 3 byte gap to align structure itself.
}

Вы увидите две секции заполнения там. Во-первых, обеспечить uint32_t правильно выровнен (вы также должны видеть, что выравнивание структуры должно быть равно четырем, чтобы uint32_t выравнивается правильно с учетом заполнения).

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

Сам стандарт C не определяет, что такое выравнивание , просто такое выравнивание может существовать. Например, ранние чипы x86 (и, возможно, текущие) обрабатывают неправильно выровненные данные очень хорошо (или могут сделать это немного медленнее), в то время как другие архитектуры (например, ранние чипы ARM) просто вылетят или вызовут ошибку, если вы попытаетесь это сделать.,

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