Я не буду вдаваться в виртуальную память (прочтите об этом, если хотите), поэтому давайте упростим и скажем, что у вас есть ОЗУ определенного размера.
У вас есть код со статическими инициализированными данными, с некоторыми статическими неинициализированными данными (статические в C ++ означают такие же, как глобальные переменные). У тебя есть код.
Когда вы что-то компилируете, компилятор (и компоновщик) организует и переводит ваш код в машинный код (байтовый код, единицы и нули) следующим образом:
Двоичный файл (и объектные файлы) организован в сегменты (части ОЗУ).
Сначала у вас есть сегмент ДАННЫХ. Это сегмент, содержащий значения инициализированных переменных. поэтому, если у u есть переменные, то есть int a=3, b = 4
, они перейдут в сегмент DATA (4 байта ОЗУ, содержащие 00000003h, и другие 4 байта, содержащие 000000004h, шестнадцатеричное представление). Они хранятся последовательно.
Тогда у вас есть сегмент кода. Весь ваш код переводится в машинный код (единицы и нули) и сохраняется в этом сегменте последовательно.
Тогда у вас есть сегмент BSS. Идут неинициализированные глобальные вары (все статические вары, которые не были инициализированы).
Тогда у вас есть сегмент СТЕК. Это зарезервировано для стека. Размер стека по умолчанию определяется операционной системой. Вы можете изменить это значение, но сейчас я не буду вдаваться в подробности. Все локальные переменные идут сюда. Когда вы вызываете какую-либо функцию, сначала аргументы func помещаются в стек, затем возвращают адрес (куда вернуться при выходе из функции), затем сюда помещаются некоторые регистры компьютера, и, наконец, все локальные переменные, объявленные в функции, получают свои зарезервированные место в стопке.
И у вас есть сегмент HEAP. Это часть ОЗУ (размер также определяется ОС), где объекты и данные хранятся с помощью оператора new
.
Затем все сегменты складываются один за другим DATA, CODE, BSS, STACK, HEAP. Есть и другие сегменты, но они здесь не интересны и загружаются в оперативную память операционной системой. В двоичном файле также есть заголовки, содержащие информацию о том, с какого места (адреса в памяти) начинается ваш код.
Короче говоря, все они являются частями ОЗУ, поскольку все, что выполняется, загружается в ОЗУ (не может быть ни в ПЗУ (только для чтения), ни на жесткий диск, поскольку жесткий диск предназначен только для хранения файлов.
person
Nenad
schedule
06.05.2014
I know what the Stack is and what the Heap is
,but I'm confused on what a stack is and what a heap is.
А? - person Rick S   schedule 07.05.2014malloc
илиnew
части хранилища. Могут быть другие (определяемые пользователем) стеки и кучи, которые управляют совершенно другими задачами. - person Hot Licks   schedule 07.05.2014