Что происходит с 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