C++ stack & heap. Принцип работы при запуске программы

189
14 ноября 2018, 10:30

То что такое stack и heap объяснять не нужно, материал о том как это работает и что происходит с переменным в функциях больше чем достаточно, но потратив некоторое время заметил, что нету практически адекватных материалов о том, как происходит выделения мэмори при первом запуске программы? Когда программа компилируется и готовится билд, на тот момент уже высчитывается минимальное нужное количество памяти для ее запуска и работы, а сама программа занимает кусок памяти в stackовой области? Можно раскрытый ответ или хороший материал, который это описывает?
Как изначально под программу выделяется память и в какой именно части?

Answer 1

А в чем проблема? Транслятор знает размеры всех объектов. При входе в функцию выделяется стековый кадр нужного размера и в нем размещаются локальные переменные. Размеры объектов в куче тоже известны или в момент трансляции или в момент исполнения. Аппаратный стек увеличивается по мере работы. Не все функции вызываются при конкретном запуске (ну не прошла программа по этой ветке по воле пользователя), поэтому аппаратный стек от запуска к запуску может быть разным. Вобщем стек в момент запуска не выделен, известна только вершина стека а там уж как пойдет. Иногда и переполнения стека (aka stackoverflow) бывают. :-)

UPD1:

А еще бывает компилированный стек. Это когда машина без аппаратного стека. Тогда транслятор и линкер анализируют код на предмет какие функции кого вызывают и размещают стек в озу так, чтобы стековые кадры при вызовах не перекрывались. Как-то я пользовался Си-компилятором от фирмы Таскинг (или Кейл, не помню сейчас) для интеловской 51-ой однокристаллки. Эта машина с аппаратным стеком в 5 или 10 байт и он используется только для прерываний. Поэтому для собственно программы там как раз был сделан компилированный стек. И, между прочим, много вызовов помещалось и все работало. Только ругалось на функции обработки прерываний, которые нигде не вызываются. Приходилось им делать вызов, но который в рантайме никогда не срабатывал.

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

READ ALSO
C++ неявное приведение типов

C++ неявное приведение типов

подскажите пожалуйста, как в компилятор С++ разрешает проблему неявного привидения типовВ частности интересует вопрос: почему в первом случае...

323
Что из себя представляет null?

Что из себя представляет null?

Нет такого типа, которому бы соответствовал instanceof от null

177
Используя Regex удалить всё, кроме того, что подходит под паттерн

Используя Regex удалить всё, кроме того, что подходит под паттерн

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

172