Подтвердить что ты не робот

Почему термины "автоматический" и "динамический" предпочтительнее терминов "стек" и "куча" в управлении памятью С++?

В связи с множеством вопросов и ответов на SO, я узнал, что лучше обращаться к объектам, чье жизненное время управляется как находящееся в автоматическом хранилище, а не в стеке.

Кроме того, динамически выделенные объекты не должны упоминаться как находящиеся в куче, но в динамическом хранилище.

Я получаю, что есть автоматическое, динамическое и статическое хранилище, но никогда не понимал разницу между автоматическим стеком и динамической кучей. Почему первые предпочитают?

Я не спрашиваю, что такое стек/куча, или как работает управление памятью. Я спрашиваю, почему термины автоматическое/динамическое хранилище предпочтительнее терминов stack/heap.

4b9b3361

Ответ 1

Автоматически сообщает мне что-то о времени жизни объекта: в частности, что он автоматически привязан к охватывающей области и автоматически будет уничтожен при выходе этой области.

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

Stack - это перегруженное имя для типа контейнера, а также связанный с ним популярный протокол указателей команд, поддерживаемый общими инструкциями call и ret. Это ничего мне не говорит о времени жизни объекта, кроме как через историческую связь с объектами жизни в C, из-за популярных соглашений о кадре стека. Обратите также внимание на то, что в некоторых реализациях потоковое локальное хранилище находится в стеке потока, но не ограничивается областью какой-либо одной функции.

Куча снова является перегруженным именем, указывающим либо тип сортированного контейнера, либо систему управления свободным хранилищем. Это не единственный бесплатный магазин, доступный во всех системах, и он не говорит мне ничего конкретного о времени жизни объекта, выделенного new.

Ответ 2

В большинстве реализаций используется стек для обратных объектов с автоматическим хранилищем. Это не требуется стандартом, но в наши дни он отлично работает на большинстве архитектур процессоров.

Реализации используют различные стратегии для возврата объектов с динамической продолжительностью хранения. Я не уверен, что heap - лучший способ описать, что используют современные распределители памяти, но это, по-видимому, "исторический" термин для этого.

Таким образом, автоматическое/динамическое хранилище - это термины, используемые стандартом для классификации ( "абстрактного" ) времени жизни объекта. Это правильные условия использования, если вы хотите говорить об объектах, как их описывает стандарт.
Стеки и кучи - это ( "конкретные" ) методы реализации, которые можно использовать для их поддержки. Использование этих терминов является менее правильным, если вы не говорите о конкретной реализации.

Ответ 3

Условия автоматического/динамического хранения предпочтительнее просто потому, что это то, что требует стандарт. Стек/куча основаны на реализации и теоретически могут быть реализованы по-другому.

Ответ 4

Технически говоря, распределение стека/кучи - это детали реализации, в то время как автоматическое/динамическое хранилище - более общие термины. Сам стандарт не гарантирует, что распределитель должен использовать стек/кучу. Поэтому автоматическое/динамическое является более правильным термином, хотя лично я считаю, что это различие слишком чересчур педантично.

Ответ 5

Термины "статическая продолжительность хранения", "продолжительность автоматического хранения" и "динамическая длительность хранения" отображаются в стандарте С++.

Термины "стек" и "куча" используются для обозначения функций в стандартной библиотеке (stack<>, make_heap(), push_heap() и т.д.), которые имеют мало общего с продолжительностью хранения.

Ответ 6

Стек и куча вносят понятия, связанные с реализацией в изображение, тогда как термины "автоматический" и "динамический" являются более общими