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

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

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

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

указатели

Объекты

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

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

 dasblinkenlight24 мар. 2012 г., 19:39
Я чувствую запах домашней работы или подготовки к экзамену :) Все это нормально, если вопрос помечен соответствующим образом.
 Kerrek SB24 мар. 2012 г., 20:09
@Maiss: C ++ ничего не делает. Этоязык, Твойкомпилятор создает инструкции машинного кода для вашего компьютера на основе программы, написанной на этом языке.
 Kerrek SB24 мар. 2012 г., 19:41
Не перепутайязыки программирования а такжевычислительное оборудование, Первый - это язык, последний ломается, когда вы бросаете его на пол. Языки программирования могут быть использованы дляинструктировать компьютер, но они в первую очередь абстрактная конструкция.
 Maiss24 мар. 2012 г., 20:08
@Kerrek SB: Если бы я мог сказать, тогда где C ++ дает команду компьютеру поставить их в конце?

Ответы на вопрос(3)

Решение Вопроса

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

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

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

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

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

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

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

 Guy Sirton24 мар. 2012 г., 19:41
Все идет в виртуальную память, которая не всегда в оперативной памяти ...
 pg198924 мар. 2012 г., 19:44
Ага. Если вы (оп) пишете на C ++, который вообще требует какой-либо производительности, то детали реализации виртуальной памяти очень важны. Проверьте эту страницу википедии, чтобы начать:en.wikipedia.org/wiki/Paging
 user39576024 мар. 2012 г., 19:44
Я полагаю, что его смысл в том, что части виртуальной памяти, а именно страницы, могут и будут выгружены на диск.
 Luchian Grigore24 мар. 2012 г., 19:59
@ Делай, это зависит. Например, в MS, если вы ссылаетесь на библиотеку, она будет полностью загружена во время выполнения, в начале программы. Если вы загрузите его программно, черезLoadLibrary(), он загружается в память при вызове функции и может быть выгружен из памяти.
 Luchian Grigore24 мар. 2012 г., 19:41
@GuySirton Я это уточнил, но чаще всего это RAM.

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

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

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

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

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

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

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

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

Ваш ответ на вопрос