Почему термины «автоматический» и «динамический» предпочтительнее, чем термины «стек» и «куча» в управлении памятью C ++? - PullRequest
20 голосов
/ 07 февраля 2012

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

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

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

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

Ответы [ 6 ]

32 голосов
/ 07 февраля 2012

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

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

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

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

9 голосов
/ 07 февраля 2012

Большинство реализаций используют стек для поддержки объектов с автоматическим хранением. Это не требуется стандартом, но в наши дни хорошо работает на большинстве архитектур ЦП.

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

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

6 голосов
/ 07 февраля 2012

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

5 голосов
/ 07 февраля 2012

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

4 голосов
/ 07 февраля 2012

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

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

1 голос
/ 07 февраля 2012

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

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