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

Я знаю, что существуют разделы как Стек, "куча", Код и Данные. Стек/"куча" они используют тот же раздел памяти, как они могут вырасти независимо? Какова эта секция кода? То, когда у меня есть функция, является ею часть стека или секции кода? Также, что, это инициализировало/деинициализировало сегмент данных?

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

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

Какие-либо хорошие ссылки/статьи для того же?

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

13
задан Sam 21 June 2010 в 06:18
поделиться

4 ответа

AFAIK:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3
ответ дан 2 December 2019 в 00:17
поделиться

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

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

char tmpStr[] = "hello";

Тогда часть исходного кода, содержащая «привет», будет находиться в разделе родата.

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

0
ответ дан 2 December 2019 в 00:17
поделиться

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

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

3
ответ дан 2 December 2019 в 00:17
поделиться

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

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

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

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

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

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

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

7
ответ дан 2 December 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: