Каково расположение памяти программы C/С++?

Я знаю, что есть такие разделы, как Stack, Heap, Code и Data. Stack/Heap они используют один и тот же раздел памяти, поскольку они могут расти независимо? Что это за раздел кода? Когда у меня есть функция, это часть стека или секция кода? Также что это инициализированный/неинициализированный сегмент данных?

Имеется ли доступный раздел памяти только для чтения? Когда у меня есть константная переменная, то, что на самом деле происходит, заключается в том, что компилятор отмечает раздел памяти как прочитанный или помещается в раздел памяти только для чтения.

Где хранятся статические данные? Где хранятся глобальные данные?

Любые хорошие ссылки/статьи для них?

Я думал, что разделы и макет памяти независимы от ОС и больше связаны с компилятором. Не выполняется ли стек, куча, код, данные [Инициализированный, неинициализированный] сегмент во всей ОС? Когда есть статические данные, что происходит, компилятор понял, что он статичен, что дальше, что он будет делать? Это компилятор, который управляет программой, и он должен знать, что делать правильно? Все компиляторы не должны следовать общим стандартам?

Ответ 1

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

Код имеет разрешение на выполнение. Другие сегменты этого не делают. В приложении Windows вы не можете просто поместить некоторый собственный код в стек и выполнить. Linux предлагает ту же функциональность, что и в архитектуре x86.

Данные - это данные, которые являются частью результата (.exe и т.д.), но не могут быть записаны. Этот раздел в основном там, где идут литералы. Разрешаем читать только в этом разделе.

Эти два сегмента являются частью полученного файла. Stack and Heap - это среда выполнения, вместо того, чтобы отображать жесткий диск.

Стек по существу один, большой (1 МБ или около того, многие компиляторы предлагают настройку для него) распределение кучи. Компилятор управляет им для вас.

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

Имеется постоянное запоминающее устройство (ПЗУ). Однако это только раздел данных. Вы не можете изменить его во время выполнения. Когда вы создаете константную переменную, в ней ничего особенного не происходит. Все, что происходит, это то, что компилятор будет создавать на нем определенные инструкции. Это. x86 не имеет никакого знания или понятия const-all в компиляторе.

Ответ 2

В основном это зависит от ОС.

Для окон взгляните на книги Петцольда или Рихтера. Для Linux вы можете прочитать источник!

Ответ 3

AFAIK:

Stack/Heap они используют один и тот же раздел памяти так как они могут расти независимо?

Они могут расти без изменений.

Что это за раздел кода?

Сегмент, доступный только для чтения, где хранятся данные кода и константы.

Когда у меня есть функция, это часть стека или раздел кода?

Определение (код) функции будет в CS. Аргументы каждого вызова передаются в стек.

И что это такое инициализированные/неинициализированные данные сегмент?

В сегменте данных хранятся глобальные/статические переменные.

Есть ли раздел памяти только для чтения доступны?

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

Когда у меня есть константная переменная, что на самом деле происходит заключается в том, что компилятор отмечает память раздел только для чтения или он помещается в раздел памяти только для чтения.

Он переходит в CS.

Где хранятся статические данные? Где сохраняются глобальные данные?

Сегмент данных.

Ответ 4

(Примечание: к Linux относится следующее:

Стек и куча процесса существуют в "той же" части памяти процесса. Стек и куча растут по направлению друг к другу (сначала, когда процесс запускается, стек занимает всю область, которая может быть занята комбинацией стека и кучи; каждое распределение памяти (malloc/free/new/delete) может нажмите границу между стеком и кучей вверх или вниз). Раздел BSS, также расположенный на одном и том же пространстве операций с OS-диском, находится в своем разделе и содержит глобальные переменные. Данные только для чтения находятся в разделе rodata и содержат такие строки, как строковые литералы. Например, если ваш код имеет строку:

char tmpStr[] = "hello";

Затем часть исходного кода, содержащая "hello", будет находиться в секции rodata.

Хорошая, тщательная книга об этом - компьютерные системы Рэндалла Э. Брайанта.

Ответ 5

Я был в той же дилемме, когда читал о макете памяти C/С++. Вот ссылка, которую я последовал, чтобы очистить вопросы.

http://www.geeksforgeeks.org/memory-layout-of-c-program/

Ссылка на основную ссылку добавлена ​​здесь:

введите описание изображения здесь

Я надеюсь, что это поможет "найти" ответы на аналогичный вопрос.