Размер дочернего класса со структурой наследования алмазов кажется странным - PullRequest
3 голосов
/ 30 мая 2019

у меня 4 класса А, В, С, D. B и C наследуют A, а D наследуют B и C.

Если A, B, C, D не имеет какой-либо переменной-члена, sizeof(D) возвращает 1 (что ожидается). Но когда B имеет одно целое число в качестве переменной-члена, sizeof(D) внезапно меняется на 8.

Так как sizeof(int) равно 4, разве sizeof(D) также не должно возвращать 4?

class A
{
};

class B : public A
{
    int data;
};

class C : public A
{
};

class D : public B, public C
{
};

int main()
{
    sizeof(A); // 1
    sizeof(B); // 4
    sizeof(C); // 1
    sizeof(D); // 8?
}

1 Ответ

4 голосов
/ 30 мая 2019

У вас есть 2 A подобъектов в D, и они должны иметь различные представления.Следовательно, нижняя граница на sizeof(D) равна 1 + sizeof(int).

Используемая вами реализация выбрала размер D таким образом, чтобы (sizeof(D) % alignof(D)) == 0.

Ваша реализация не соответствует полностью пустому случаю, так как содержит два различных A s.в том же хранилище.

...