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
.
подробно: где хранятся члены-члены класса в куче?