Вопрос об использовании памяти программирования для начинающих - PullRequest
1 голос
/ 22 марта 2010

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

  1. При запуске исполняемого файла загружается ли весь исполняемый файл в память?

  2. Из недолгого общения я обнаружил, что константы на самом деле не являются константами? Это просто компилятор?

const int i = 5;

_asm { mov i, 0 } // я теперь 0 и прекрасно компилируется

Значит, все переменные также имеют постоянное значение, встроенное в файл? Значение:

int a = 1;

const int b = 2;

void something() { const int c = 3; int d = 4; }

Я найду все эти переменные, встроенные в файл (в шестнадцатеричном редакторе или что-то еще)?

  1. Если исполняемый файл загружен в память, то «константы» технически используют память? Я читал в сети людей, которые говорили, что константы не используют память, это правда?

Ответы [ 2 ]

2 голосов
/ 22 марта 2010
  1. Текст (т.е. код) вашего исполняемого файла и сегменты данных отображаются в виртуальном адресном пространстве процесса при запуске исполняемого файла, но байты могут фактически не копироваться с диска до тех пор, пока к этим ячейкам памяти не будет произведен доступ. Смотри http://en.wikipedia.org/wiki/Demand_paging

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

  3. Константа собирается где-то занимать память - если в вашей программе есть постоянное число 42, в памяти должно быть место где-то 42, даже если это означает, что она хранится в качестве аргумента инструкции немедленного режима.

1 голос
/ 22 марта 2010

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

Да, переменные const занимают место в памяти, но компиляторы свободны для оптимизации
для использования памяти и размера кода, и вставьте их значения в код.
(в случае, если они не обнаруживают никаких адресных ссылок для этих переменных)

const char * он же C строки , обычно компиляторы интернированы для экономии памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...