Потерянное пространство в макете в Основных принципах CPP

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

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

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

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

X waste(const char* p)
{
    if (!p) throw Nullptr_error{};
    int n = strlen(p);
    auto buf = new char[n];
    if (!buf) throw Allocation_error{};
    for (int i = 0; i < n; ++i) buf[i] = p[i];
    // ... manipulate buffer ...
    X x;
    x.ch = 'a';
    x.s = string(n);    // give x.s space for *p
    for (gsl::index i = 0; i < x.s.size(); ++i) x.s[i] = buf[i];  // copy buf into x.s
    delete[] buf;
    return x;
}

void driver()
{
    X x = waste("Typical argument");
    // ...
}

Тогда говорится:

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

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

0 ответов

Структура начинается с выравнивания по умолчанию. Первый член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
};
Другие вопросы по тегам