Как компиляторы распределяют память для классов?

89
6

Когда я создаю класс с указателем класса, например:


class A{
B* p_b1;
B* p_b2;
A(){}
}

Я предполагаю, что компилятор создает пространство, по крайней мере, для 2 указателей на экземпляр A. Мой вопрос в том, что если они не указатели, а скорее такие объекты, как:


class A{
B b1;
B b2;
A(){}
}

Будет ли компилятор выделять пространство для b1 и b2 в пространстве памяти класса A? Или он объявит фактические классы B в другом месте в стеке?


Причина, по которой я спрашиваю об этом, заключается в том, что я пытаюсь уменьшить выделение памяти в моем коде и блуждал, если бы это имело какое-либо значение.

спросил(а) 2015-11-07T05:22:00+03:00 4 года, 10 месяцев назад
1
Решение
93

Будет ли компилятор выделять пространство для b1 и b2 в пространстве памяти класса A?



Да.


Или он объявит фактические классы B в другом месте в стеке?


Нет.


Причина, по которой я спрашиваю об этом, заключается в том, что я пытаюсь уменьшить выделение памяти в моем коде и блуждал, если бы это имело какое-либо значение.



Да, это будет иметь значение. Выделение памяти в стеке более эффективно, чем выделение памяти из кучи. Если вы можете, предпочтете стек кучи для распределения памяти, когда производительность становится проблемой.

ответил(а) 2015-11-07T05:28:00+03:00 4 года, 10 месяцев назад
41

На самом деле это зависит. Все, что является полем объекта, будет распределено так же, как и объект (как в стеке, так и в куче). Если вы хотите уменьшить выделение, вы можете посмотреть на повторное использование объектов. Вы можете вызвать деструктор вручную, а затем вызвать размещение нового для повторного использования памяти объекта.

Если, с другой стороны, вы просто хотите уменьшить размер используемого стека, тогда выделите кучу в конструкторе и освободите его в деструкторе (RAII).

ответил(а) 2015-11-07T05:50:00+03:00 4 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема