Неиспользуемое пространство в макете в основных рекомендациях CPP

Я читал Основные принципы CPP, P.9: Не тратьте время и место:

Пример, плохой:

struct X {
    char ch;
    int i;
    string s;
    char ch2;

    X& operator=(const X& a);
    X(const X&);
};

Затем в нем говорится:

... Обратите внимание, что макет X гарантирует, что по крайней мере 6 байтов (а, скорее всего, больше) будут потрачены впустую.

Почему 6 байт гарантированно будут потрачены впустую? И как можно исправить (кроме объявления конструктора, который является источником отходов примера)


person Moia    schedule 31.01.2019    source источник
comment
Байты тратятся впустую из-за заполнения после каждого члена char для выравнивания всего по 4 байта.   -  person Innokentiy Alaytsev    schedule 31.01.2019
comment
Вы уже видели это?: Википедия: выравнивание структуры данных   -  person Scheff's Cat    schedule 31.01.2019
comment
Интересное чтение: Утраченное искусство упаковки структур catb.org/esr/structure-packing   -  person Robert Andrzejuk    schedule 31.01.2019


Ответы (1)


Структура начинается с выравнивания по умолчанию. Первый элемент ch выровнен. i - это int, и он должен быть выровнен по четырем байтам (когда int имеет длину четыре байта), поэтому между ch и i вы получаете трехбайтовое заполнение. То же самое верно и в конце структуры после ch2, где вы получаете три байта заполнения. Они вставляются так, чтобы для X x[2]; оба элемента были правильно выровнены в памяти.

struct X {
    char ch;
    char padding1[3]; // so that int i is int-aligned (four bytes)
    int i;
    string s;
    char ch2;
    char padding2[3]; // end of struct must also be aligned
};
person Werner Henze    schedule 28.02.2020