Рассмотрим эту простую программу
#include <iostream>
struct A
{
int x1234;
short x56;
char x7;
};
struct B : A
{
char x8;
};
int main()
{
std::cout << sizeof(A) << ' ' << sizeof(B) << '\n';
return 0;
}
Отпечатает 8 12
. Даже если B
может быть упакован в 8 байтов без нарушения требований к выравниванию, вместо этого он принимает жадные 12 байт.
Было бы неплохо иметь sizeof(B) == 8
, но ответ на
Является ли размер структуры, который должен быть точным кратным выравниванию этой структуры? предполагает, что нет способа.
Поэтому я был удивлен, когда следующий
struct MakePackable
{
};
struct A : MakePackable
{
int x1234;
short x56;
char x7;
};
struct B : A
{
char x8;
};
напечатано 8 8
.
Что здесь происходит? Я подозреваю, что стандартные макеты-типы имеют к этому какое-то отношение. Если да, то в чем причина его возникновения, поскольку единственная цель этой функции - обеспечить двоичную совместимость с C?
EDIT: Как указывали другие, это ABI или специфический для компилятора, поэтому я должен добавить, что это поведение наблюдалось на x86_64-unknown-linux-gnu со следующими компиляторами:
- clang 3.6
- gcc 5.1
Я также заметил что-то странное из clag struct dumper. Если мы попросим размер данных без заполнения хвоста ( "dsize" ),
A B
first 8 9
second 7 8
то в первом примере получим dsize(A) == 8
. Почему это не 7?