Выделение памяти статическим переменным (выделение памяти во время компиляции)

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

  1. Если я скомпилирую свое приложение несколько раз, будет ли каждый раз выделяться память?
  2. Если да, то к тому времени он может потреблять всю память моего компьютера. Практически никогда не бывает. Как?
  3. Кроме того, когда мы запускаем исполняемый файл того же приложения на другом компьютере, он работает успешно. Как он находит статические переменные в памяти другого компьютера, если он был скомпилирован на другом компьютере.
  4. Кроме того, если я запущу много экземпляров одного и того же приложения, будет ли копия статических переменных создана для всех экземпляров или одна статическая переменная будет использоваться всеми экземплярами? Думаю, копия будет создана. Но здесь у меня есть сомнения, что память была выделена во время компиляции, и один экземпляр приложения может использовать эту память, так как другие экземпляры будут выделять память для этих статических переменных.

    В целом, у меня есть сомнения по поводу того, что на самом деле означает «выделение памяти во время компиляции»?


person Praveen Kumar    schedule 09.08.2014    source источник


Ответы (1)


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

В частности, это поле обычно сохраняется в разделе выходного файла, который называется BSS. . Компилятор помещает объявление статической переменной в BSS, загрузчик программ ОС считывает раздел BSS при загрузке программы и выделяет достаточно памяти во вновь созданном процессе для хранения BSS.

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

person antiduh    schedule 09.08.2014
comment
Это означает, что фактическое выделение памяти для всех статических переменных выполняется, когда загрузчик загружает приложение в память. Когда мы запускаем приложение, для этого процесса создается пространство памяти (включая BSS), и ядро ​​заполняет эти области (включая BSS) и выделяет память для всех статических переменных. - person Praveen Kumar; 09.08.2014