Задавая другой вопрос (а также раньше), мне было интересно, как мне решить, создавать ли объект в куче или сохранять его как объект в стеке? Что я должен спросить себя об объекте, чтобы сделать правильное распределение?
С++ Когда выделять в куче или стеке?
Ответы (5)
Поместите его в кучу, если нужно, и в стек, если можете.
Какие вещи нужно положить в кучу? Что угодно разной длины. Любой объект, который может быть нулевым. Все, что очень большое, чтобы не вызвать переполнение стека.
NULL
или nullptr
.
- person Mark Lakata; 14.09.2015
Простой ответ.
Когда он выходит за рамки, хотите ли вы, чтобы он зависал и мог его использовать?
Зависит от предполагаемого срока службы объекта.
- Если вы хотите, чтобы объект оставался живым даже после возврата функции, тогда HEAP, иначе STACK
Если объект помещается в HEAP, он должен быть явно освобожден или удален программистом после завершения его использования; иначе у программы будет утечка памяти.
Две причины использовать кучу:
1- Вам нужны данные после текущей области.
2- Вы хотите зарезервировать большой объем памяти.
В остальном оставайтесь в стеке.
Примечание: не резервируйте много памяти в стеке, иначе вы получите «переполнение стека»;)
Память стека быстрая. Это быстро, потому что (а) нет системных накладных расходов на выделение памяти - выделение выполняется простым перемещением указателя стека в одной инструкции и (б) память в стеке «горячая», поэтому она уже находится в кеше. Память кучи медленная, потому что (а) она требует большой работы системы, чтобы осмотреться и найти свободный фрагмент памяти и (б) вероятно, не находится в кеше и потребует удаления некоторых данных, которые вы, возможно, хотели.
Память стека не фрагментируется. Вполне возможно, что куча в конечном итоге становится настолько фрагментированной, что вы не можете ничего выделить (хотя по иронии судьбы неиспользуемой памяти все еще достаточно!)
Для долгоживущих данных и для больших данных (несколько КБ и более) вы должны использовать кучу.
Опасность выделения большего стека заключается в том, что это может повредить вам, если вы запускаете несколько потоков. Вы должны определить размер стека для использования в «худшем случае». Каждому потоку требуется свой собственный стек. На машине с большим количеством ядер (где у вас может быть запущено более 200 потоков) вы можете не захотеть произвольно увеличивать стек. С другой стороны, куча не должна быть рассчитана на использование в "худшем случае" - это намного эффективнее.