2015-03-01 7 views
1

Я понимаю процесс выделения памяти для программ на C++. Согласно тому, что я получил из Интернета, для компиляторов C++ память выделяется для глобальных переменных и статических переменных во время компиляции. В то время как динамически создаваемые переменные (например, операции new/malloc) будут заданы в памяти только тогда, когда исполняемые файлы фактически запущены. Поправьте меня, если я ошибаюсь.Когда память выделена для программ?

Так верно ли, что если исполняемый файл никогда не выполняется, то часть памяти, ранее выделенная при компиляции времени для глобальных статических переменных, остается и остается в памяти до тех пор, пока компьютер не будет закрыт? Что делать, если мы выключим компьютер и перезагрузим его, а затем перезапустим исполняемые файлы? На этот раз процесс компиляции отсутствует, когда ОС выделяет память для глобальных статических переменных этой статической переменной &? Является ли он на этапе загрузки системы или когда исполняемый файл фактически выполняется?

Теперь этот вопрос распространяется на любую общую программу на ПК. Например, программа Microsoft Word. Мы не кодировали и не компилировали его сами, мы только что установили его из установочного пакета, поэтому в этой ситуации процесс компиляции не выполняется (или, возможно, процесс установки - это процесс компиляции). Предположим, что эти общие программы также нуждаются в пространстве в памяти для статических глобальных переменных &, когда ОС выделяет память для этих программ? Это когда мы включаем и загружаем ОС или когда исполняем исполняемые файлы этих программ? Если ОС загружает все эти статические переменные во время загрузки, это объясняет, почему процесс загрузки ОС занимает некоторое время, но, похоже, это пустая трата ресурсов памяти, если 90% программ, установленных в системе, не будут выполняется каждый раз, когда пользователь активирует и использует свой ПК.

+1

Во время компиляции память не выделяется. Распределение памяти начинается с * времени выполнения *. – emlai

+0

Я думал, что вопрос очевиден, и связан с программированием, если немного странно и наивно (но это нормально). Очевидно, за этим стоит задуматься, что больше, чем можно сказать по большинству вопросов здесь в эти дни. Гораздо лучше, чем «почему моя программа сбой». Возможно, я немного склонен. –

+0

@JasonC: Он слишком широк. ОП должен читать книгу «Блум». Мы не можем преподавать, как работают компиляторы. Возможно, «задумались», но нулевые исследования. –

ответ

6

Компилятор по существу компилирует все статические вещи и код в изображение, которое хранится на диске, например. в файлах exe в Windows и т. д.

При запуске операционной системы операционная система выделяет некоторую память и в основном копирует это изображение в ram, а затем запускает скомпилированный код, который также копируется в ram.

Память, которую вы распределяете динамически в своей программе, выделяется по мере выполнения вашей программой.

Во время компиляции для вашей программы не размещается баран. Заявление «память выделяется во время компиляции» является концептуальным упрощением. Что это такое действительно означает, что исходное изображение памяти, хранящееся в скомпилированном файле, создается во время компиляции. Это не будет загружено в RAM до тех пор, пока программа не будет запущена.

Это очень упрощенный, но общий смысл. Ознакомьтесь с спецификациями формата файла для формата двоичного файла в вашей системе для получения еще более интересных советов (for example), среди прочего.

Смежные вопросы