Что происходит с RAM, Harddrive, Stack and Heap в С++?

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

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

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

  • Указатели

  • Объекты

И есть ли стек/куча, находящиеся в физической памяти?

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

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Некоторые операционные системы будут загружать части исполняемого файла по мере его доступа (см. "Задержка загрузки" ), что более часто встречается для динамически загружаемых библиотек (DLL в Windows и общих объектов в UNIX-подобных системах). Это в основном влияет на текущее "расположение" функций, они либо "на диске", либо исполняемый файл, либо "в памяти", если эта часть исполняемого файла была отображена.

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

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

Ответ 3

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

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

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