Почему термины "автоматический" и "динамический" предпочтительнее, чем термины "стек" и "куча" в управлении памятью C++?
В связи с большим количеством вопросов и ответов по SO, я узнал, что лучше обращаться к объектам, чье время жизни управляется как находящееся в автоматическом хранилище, а не в стеке.
Кроме того, динамически распределяемые объекты должны называться не находящимися в куче, а в динамическом хранилище.
Я понимаю, что существует автоматическое, динамическое и статическое хранилище, но никогда не понимал разницу между автоматическим стеком и динамической кучей. Почему первое предпочтительнее?
Я не спрашиваю, что означает стек / куча или как работает управление памятью. Я спрашиваю, почему термины автоматическое / динамическое хранилище предпочтительнее, чем термины стек / куча.
6 ответов
Автоматическое сообщает мне кое-что о времени жизни объекта: в частности, что он автоматически привязан к окружающей области и будет автоматически уничтожен при выходе из этой области.
Dynamic сообщает мне, что время жизни объекта не контролируется автоматически компилятором, но находится под моим непосредственным контролем.
Стек является перегруженным именем для типа контейнера и для соответствующего протокола указателя популярных команд, поддерживаемого общим call
а также ret
инструкции. Он ничего не говорит мне о времени жизни объекта, кроме как через историческую связь с временем жизни объекта в C из-за популярных соглашений стекового фрейма. Также обратите внимание, что в некоторых реализациях локальное хранилище потока находится в стеке потока, но не ограничено областью действия какой-либо одной функции.
Куча снова является перегруженным именем, указывающим либо тип отсортированного контейнера, либо систему управления бесплатными хранилищами. Это не единственный бесплатный магазин, доступный во всех системах, и при этом он не говорит мне ничего конкретного о времени жизни объекта, выделенного с помощью new
,
В большинстве реализаций стек используется для автоматического сохранения объектов. Это не требуется стандартом, но в наши дни хорошо работает на большинстве архитектур ЦП.
Реализации используют различные стратегии для поддержки объектов с динамической продолжительностью хранения. Я не уверен, что куча - лучший способ описать то, что используют современные распределители памяти, но это, кажется, "исторический" термин для этого.
Таким образом, автоматическое / динамическое хранение - это термины, которые стандарт использует для классификации ("абстрактного") времени жизни объекта. Это те термины, которые следует использовать, если вы хотите говорить об объектах так, как их описывает стандарт.
Стеки и кучи - это ("конкретные") методы реализации, которые можно использовать для их поддержки. Использование этих терминов менее правильно, если вы не говорите о конкретной реализации.
Технически говоря, выделение стека / кучи - это детали реализации, а автоматическое / динамическое хранение - более общие термины. Сам стандарт не требует, чтобы распределитель использовал стек / кучу. Поэтому автоматический / динамический является более подходящим термином, хотя лично я считаю, что это различие слишком чрезмерно педантичное.
Условия автоматического / динамического хранения предпочтительны просто потому, что этого требует стандарт. Стек / куча основаны на реализации и теоретически могут быть реализованы другим способом.
Термины "статическая продолжительность хранения", "длительность автоматического хранения" и "длительность динамического хранения" встречаются в стандарте C++.
Термины "стек" и "куча" используются для обозначения функций в стандартной библиотеке (stack<>
, make_heap()
, push_heap()
и т. д.), которые имеют мало общего с продолжительностью хранения.
Стек и куча вносят в картину понятия, связанные с реализацией, тогда как термины "автоматический" и "динамический" являются более общими