Есть ли в C ++ область памяти под названием «стек» для хранения автоматических переменных - PullRequest
12 голосов
/ 14 января 2011

Есть ли в C ++ определенная область памяти, называемая стеком, в которой хранятся автоматические переменные.

Ответы [ 5 ]

18 голосов
/ 14 января 2011

Нет.Только в стандарте упоминается:

- длительность статического хранения

- длительность автоматического хранения

- длительность динамического хранения

Неттакая вещь, как «стек памяти» в C ++.Тем не менее, принято говорить, что переменные продолжительности автоматического хранения «распределяются в стеке», поскольку это способ, которым они реализуются с точки зрения компьютерных наук.«Куча» - это еще один термин, который обычно относится к динамической продолжительности хранения, но не упоминается в стандарте.

3 голосов
/ 15 января 2011
  • У большинства процессоров есть область памяти, называемая стеком.
  • Компиляторы C ++ обычно используют стек процессора для автоматических переменных, но не обязаны это делать.Один очень распространенный случай - когда переменная хранится в регистре процессора и никогда не сохраняется в памяти.
2 голосов
/ 18 января 2011

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

Простая аналогия: предположим, что вы пытались научить кого-то начинающему географии.В какой-то момент студент спрашивает: «Франция в Европе?»Что бы вы посчитали правильным ответом на такой вопрос?

(а) Нет. Французская конституция не определяет границы страны.Поэтому невозможно сказать, где находится Франция.

(b) Нет. Возможно, что когда-нибудь в будущем Земля будет разрушена, и французские беженцы сядут на другой планете и восстановят там свою нацию.Или могут быть альтернативные вселенные, в которых Франция находится в другом месте.Поэтому мы не можем сказать, где находится Франция.

(c) Да.Франция в Европе.

(d) В основном да.Центральное правительство и основная часть населения Франции находятся в Европе, хотя они контролируют территории в других местах, например Французскую Гвиану в Южной Америке и Остров Реюньон в Индийском океане.

Я бы ответил (с), есливопрос задавался общим способом или начинающим учеником, или (d) если контекст указывал, что требовался более точный ответ.Видимо, некоторые из плакатов здесь настаивают на том, что правильный ответ (а) или (б).Они говорят, что буквально НЕПРАВИЛЬНО смотреть на мир таким, какой он есть на самом деле, и что единственный правильный ответ на вопрос - искать какой-то документ, описывающий мир так, как утверждают некоторые авторитеты.

Если вы считаете, что эта аналогия натянута, и вы хотите более чисто ИТ-обсуждения, позвольте мне предложить более близкую аналогию.Предположим, вы читаете урок по веб-дизайну, и студент спрашивает: «Как я могу выразить сложные математические формулы на веб-странице?»

Можно ли сказать, что правильный ответ: «Используйте тег и связанные с ним теги, такие как ABOVE и BELOW, ROOT и ARRAY, как определено в стандарте HTML 3.2. "

Такой ответ был бы абсолютно верным в том смысле, что стандарт HTML 3.2 действительно включает такие теги.К сожалению, ни один крупный браузер не реализует эти теги.Тот факт, что он входит в стандарт, не имеет большого практического применения.

Я мог бы сказать то же самое о многих функциях ИТ-продуктов.«Как мне ограничить количество строк вывода из SQL-запроса?»Реальный ответ зависит от того, какой движок базы данных вы используете.Я не знаю, что говорит стандарт SQL, предоставляет ли он какие-либо средства, и мне все равно, потому что это не имеет значения.В реальной жизни я не использую стандарт ANSI SQL на своем сервере баз данных, я использую Postgres, Oracle, MySQL или какой-либо другой продукт.

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

Настаивать на том, что не имеет значения, как компьютер НАСТОЯЩИМ работает в реальной жизни, но что мы можем ТОЛЬКО рассмотреть, как кто-то сказал, что он считает, что это должно работать,бесполезно для тех, кто пытается писать программы, работающие на реальных компьютерах.

(Да, есть практический пример для написания программ, которые будут работать с любым совместимым со стандартами компилятором, если вам интереснов кросс-платформенной совместимости и восходящей совместимости. Мы, безусловно, могли бы обсудить целесообразность использования трюков, которые зависят от конкретной реализации: когда производительность или удобство кодирования перевешиваются хрупкостью нестандартной реализации?)

Честно говоря, я думаю, что такой ответ - педантизм, который просто смущает начинающего ученика.Когда начинающий студент спрашивает, на каком континенте находится Франция, он не хочет или не нуждается в длинном ряду гипотетических, теоретических и особых случаев.Ему нужен простой и прямой ответ.То же самое, когда он спрашивает: «Переменные моей функции хранятся в стеке?»или "Моя программа загружена в ОЗУ во время выполнения?"

1 голос
/ 14 января 2011

Неясный вопрос, но да. Стек программы в C ++ обычно начинается высоко в виртуальном адресном пространстве программы и перемещается «вниз» в направлении виртуального адресного пространства кучи программы.

EDIT:

Поскольку я начал спорить, говоря «да», я добавлю ответ. Стандарт C ++ специально не требует, чтобы стек использовался для реализации локального хранилища. Однако это обычная практика реализации, как описано выше.

0 голосов
/ 14 января 2011

Пожалуйста, обратитесь к этому ответу , где я объясню это подробно.

В заключение, цитата из него:

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

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

Надежда, которая проясняет для вас вещи.

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