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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

  • Большинство процессоров имеют область памяти, называемую стеком.
  • Компиляторы С++ обычно используют стек процессора для автоматических переменных, но не требуются для этого. Один очень распространенный случай - когда переменная хранится в регистре процессора и никогда не сохраняется в памяти.

Ответ 3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 4

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

EDIT:

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

Ответ 5

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

Вкратце, цитата из него:

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

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

Надеюсь, что это очистит вас.