Что идет в RAM, Harddrive, Stack и Heap в C ++?
===============================================

Может ли кто-нибудь рассказать в общем, что идет к чему (Harddrive, RAM, Stack или Heap) во время выполнения в C ++ для этих случаев:

Локальные / глобальные переменные

Классы, Методы и функции

указатели

Объекты

И расположены ли стек / куча в физической памяти?

Буду признателен, если кто-нибудь сможет включить аппаратную аналогию в ответ. Благодарю.

**зависит от ОС**, но это обычно так:

Все идет в ОЗУ. Двоичный файл находится на жестком диске, но при запуске он полностью загружается вместе с зависимыми библиотеками в оперативную память.

Стек и куча являются деталями реализации, но они также находятся в оперативной памяти.

Несмотря на то, что память загружена в ОЗУ, она не адресуется напрямую. Операционная система выделяет виртуальную память для каждого процесса. Это означает, что адрес`0x001` на самом деле не находится в`0x001` в оперативной памяти, но представляет адрес в виртуальном адресном пространстве.

РЕДАКТИРОВАТЬ: Уточнение к одному из комментариев оп:

Двоичные файлы полностью или частично загружены во время выполнения? И, эти двоичные файлы доступны только один раз во время выполнения или постоянно читаются с жесткого диска?

Например, в MS, если вы ссылаетесь на библиотеку, она будет полностью загружена во время выполнения, в начале программы. Если вы загрузите его программно, через`LoadLibrary()`, он загружается в память при вызове функции и может быть выгружен из памяти.



 когда вы сохраняете программу, она переходит на жесткий диск, а когда вы начинаете компилировать и выполнять программу, она переходит в основную память (RAM). Вся память стека и кучи является частью оперативной памяти.

согласно объявлению переменной в программе и вызове функции выделяется память. размер стека по умолчанию составляет 2 МБ (из goggling) и в нем хранятся все локальные переменные вашей программы.

куча содержит все данные, которые создаются во время выполнения, т.е. через`malloc` или же`new`



ационной системы, параметров компилятора и компоновщика, исполняемого формата и миллиона других факторов.

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

Некоторые ОС загружают части исполняемого файла по мере его доступа (см. «Отложенная загрузка»), что более распространено для динамически загружаемых библиотек (DLL в Windows и Shared Objects в UNIX-подобных системах). Это в основном влияет на текущее «расположение» функций: они находятся «на диске» как исполняемый файл, или «в памяти», если эта часть исполняемого файла была отображена.

Переменные и все остальные данные программы сохраняются в памяти. Однако любая ОС, работающая с виртуальной памятью, может по своему усмотрению перенести на диск все рабочее состояние вашей программы (включая стек и кучу), а затем восстановить ее для продолжения работы вашей программы.

В заключение, все элементы в вашем списке (переменные, функции и т. Д.) Находятся в памяти, хотя в этом случае они не могут постоянно храниться в «физической памяти».