Почему размер объекта увеличивается, если класс использует виртуальное наследование? - PullRequest
0 голосов
/ 02 июня 2018

В следующем коде:

#include <iostream>

class a {
    char a;
};

class b : virtual public a {
    char b;
};

class c : virtual public a {
    char c;
};

class d : public b, public c {
    char d;
};

int main() {
    std::cout << "sizeof a: " << sizeof(a) << std::endl;
    std::cout << "sizeof b: " << sizeof(b) << std::endl;
    std::cout << "sizeof c: " << sizeof(c) << std::endl;
    std::cout << "sizeof d: " << sizeof(d) << std::endl;
    return 0;
}

вывод:

sizeof a: 1
sizeof b: 16
sizeof c: 16
sizeof d: 32

Я хочу знать, почему увеличенный размер равен 16. Размер символа равен 1, что означает увеличенный размер15. Я знаю, что виртуальному классу нужен указатель для его смещения, который добавляет 4 байта, тогда 11 байтов не имеет никакого смысла.Может кто-нибудь объяснить, почему это происходит, у меня другой вопрос, так как это дело о наследовании бриллиантов

1 Ответ

0 голосов
/ 02 июня 2018

Виртуальное наследование используется для решения проблемы Diamond в множественном наследовании.

Виртуальное наследование создаст vtable pointer в каждом объекте дочернего класса.

Он определяет размер объекта дочернего классаувеличение и увеличение размера зависят от вашей операционной системы, где ваш код соответствует.Возможно, ваш код выполнен в 64-битной ОС, поэтому размер vtable pointer составляет 8 байт.Но вы удивляетесь, почему sizeof(b) = 16. Ответ - Memory alignment механизм.Вы можете обратиться к ссылке ниже, чтобы узнать больше о том, что я говорю, и извините за мою плохую грамматику английского языка.

Выравнивание и заполнение памяти:

http://www.cplusplus.com/forum/articles/31027/

Виртуальное наследование:

https://www.cprogramming.com/tutorial/virtual_inheritance.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...