Есть ли определенная область в памяти, называемая стеком в С++, где автоматически сохраняются автоматические переменные.
Есть ли область памяти, называемая "стек" в С++, для хранения автоматических переменных
Ответ 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
Обратитесь к этому ответу, где я подробно объясню это.
Вкратце, цитата из него:
Термины "куча" и "стопка" устаревшие, относящиеся к используются самые популярные библиотеки времени выполнения эти структуры данных для хранения объектов которые были динамически и автоматически распределяются соответственно (статически распределенные объекты вписываются в ни одна категория, кстати).
В наши дни это не всегда так, и это, безусловно, не Стандарт С++, который не заботится где вещи хранятся. Это только заботит о том, как они созданы и уничтожены и о том, как долго они жить.
Надеюсь, что это очистит вас.