Что идет в RAM, Harddrive, Stack и Heap в C ++? - PullRequest
10 голосов
/ 24 марта 2012

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

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

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

  • Pointers

  • Предметы

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

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

Ответы [ 3 ]

13 голосов
/ 24 марта 2012

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

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

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

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

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

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

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

7 голосов
/ 24 марта 2012

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

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

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

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

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

0 голосов
/ 09 сентября 2016

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

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

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

...