Распределение памяти для производных классов C ++ - PullRequest
1 голос
/ 20 октября 2011

Я работаю над проектированием небольшой системы и меня интересует нюанс распределения памяти для производных классов.

Если у меня два класса

class foo {
public: int a;
Foo(): a(0) {};
 };
class bar : public foo {
public: int b;
Bar() : Foo() , b(0) {}
};

, а затем что-то сделатькак это в другом методе

Bar* purple = new Bar();

Я знаю, что будут вызваны оба конструктора (для Foo и Bar), но как будет выделяться память.Является ли память для 'a' и 'b' выделенной одновременно, так как они оба являются частью класса Bar, или это память, выделенная для 'a', когда вызывается конструктор Foo, и память для 'b'выделяется при вызове конструктора Bar.

Заранее благодарим за помощь.

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

new Bar - это всего лишь одно смежное распределение, как и new Bar[n].

. Это может помочь думать так:

Bar* purple = new Bar();

равно аналогично to:

Bar* purple = (Bar*)malloc(sizeof(Bar));

За кулисами также вызывается конструктор, и в некоторых случаях распределение может быть больше, чем sizeof(Bar);new[] является распространенным случаем, когда он больше, потому что счетчик массива тайно хранится в распределении во многих реализациях.

Обновление

Размер самого Barразмер, необходимый для хранения типа;его члены, его базы, указатель на его vtable и т. д. - все с собственным выравниванием (по умолчанию).Компилятор также может вводить отступы.

Следовательно, одно смежное распределение будет достаточно большим, чтобы вместить все, что требуется и foo, и bar, включая foo::a и bar::b.

подробно: где хранятся члены-члены класса в куче?

2 голосов
/ 20 октября 2011

Размер (bar) достаточно велик, так что он может содержать sizeof (foo), и все выделяется в одном запросе на выделение.

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