@kaka888
C, C++, Qt, Python Flask, MySQL, Lua

Корректно ли в C++ называть стек статической памятью?

Корректно ли в контексте C++ называть стек статической памятью?
Насколько я знаю, статическая память выделяется до начала исполнения программы. И в таком случае мне становится не понятно, почему везде стек называют статической памятью.
  • Вопрос задан
  • 414 просмотров
Пригласить эксперта
Ответы на вопрос 3
Vindicar
@Vindicar
RTFM!
Кирилл Гусарев, по вашему определению статическая память - это секция инициализированных данных exeшника.
ЕМНИП, C++ в эту секцию кладёт инициализирвоанные глобальные переменные. Насчёт статических локальных не уверен.

Вообще программа имеет доступ к четырём видам памяти:
- секция инициализированных данных выделяется загрузчиком, её содержимое загружается из EXE файла, где оно хранится как образ.
- секция неинициализированных данных выделяется загрузчиком, её содержимое забивается нулями. В EXE файле хранится только её размер.
- Насчёт стека не уверен. Вроде со стеком главного потока исполнения то же самое, его размер прописан в экзешнике. Но кто его выделяет - загрузчик или рантайм языка... я подозреваю, что загрузчик. Стеки дополнительных потоков выделяются по запросу программы.
- куча выделяется по ходу работы программы. Менджер кучи Windows создаёт одну кучу для процесса, дальнейшее управление кучами - дело самого процесса.

Всё это - только для виндовых EXE. Про линукс я не в курсе.

Стек статический в том смысле, что его размер в норме не меняется - блок памяти выделяется один раз, и просто используется большая или меньшая его часть.
Ответ написан
Комментировать
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Стек стоит рассматривать как отдельную категорию. И статической памятью его называть точно не стоит.
Хотя бы потому, что для работы с ним есть специальные команды процессора.
Плюс, он хоть и выделяется программе при загрузке, в отличии от статических данных, обращаться к данным в нем можно не всегда - а только ниже по стеку вызовов.
Ответ написан
Комментировать
Qubc
@Qubc
Ненавижу полисемию.
643057aba3ff2477592241.png
RAM - это RAM. static - это ключевое слово, которое заставляет компилятор что-то сделать. Стек - структура данных. Структура данных - это данные и способ взаимодействия с ними. Например, OS использует стек для размещения программ в памяти, а компилятор использует стек для организации выделения памяти для переменных и вызовов функций.
Зачем используют понятия "статическая память" и "автоматическая" - я не знаю. На мой (возможно, ошибочный взгляд) это лишь порождает запутанность. Особенно, в Си и С++, где анализ static зависит от контекста... В принципе, можно вообще запросить огромный кусок памяти с помощью static и размещать все данные только там. Сделать какой-нибудь указатель, имитирующий SP и размещать данные в таком же стиле, как это делает OS и компилятор.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы