Потерянное пространство в макете в Основных принципах 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
};