Распределение функций - PullRequest
3 голосов
/ 15 апреля 2010

Где хранятся функции в программе на C ++?

Например

int abc()
{
   //where am I stored? 
}

Я знаю, что мы можем взять адрес функции, это означает, что функции хранятся где-то в памяти. Но я уже читал во многих местах, что не выделяется память для функций.

Я в замешательстве. Многим из вас мой вопрос может показаться расплывчатым, но я не могу помочь.

Ответы [ 4 ]

9 голосов
/ 15 апреля 2010

Перед запуском ваша программа загружается в память, включая загрузку кода, реализующего функции.

После запуска программы выделение памяти для функций не производится; это делается перед запуском программы системным загрузчиком.

Это предполагает "нормальную" настольную ОС, для встроенных систем, выполняющих код из ПЗУ, ситуация часто отличается.

2 голосов
/ 15 апреля 2010

Расположение и порядок функций в памяти контролируется компоновщиком и может быть изменен путем редактирования командного файла компоновщика.

Это особенно важно во встроенных системах. Например, вы можете указать, какие функции хранятся в быстрой внутренней памяти, а какие - в более медленной внешней памяти. Порядок функций важен для оптимизации кэша и т. Д.

Чтобы узнать, где хранится каждая функция и (глобальная) переменная, найдите файл * .map, созданный компоновщиком.

0 голосов
/ 15 апреля 2010

В некоторых операционных системах функции могут храниться на диске до тех пор, пока к ним нет доступа. ОС может зарезервировать область для загрузки этих функций по требованию. Для получения дополнительной информации ищите «Пейджинг операционной системы».

Некоторые компиляторы и компоновщики позволяют программисту указывать расположение функций. Для удобства они определяют сегменты и позволяют размещать сегменты в разных местах. Во встроенных системах это позволяет некоторым функциям находиться в ПЗУ, некоторые во Flash и другие в ОЗУ.

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

0 голосов
/ 15 апреля 2010

Чтобы расширить другие два ответа:

На большинстве (не встроенных) платформ при компиляции модуля код и данные хранятся в секциях объектного файла. Компоновщик объединяет эти разделы вместе при сборке окончательной программы. Например, в форматах объектов COFF, PE и ELF весь код размещается в секции .text. Все предварительно инициализированные данные хранятся в разделе .data или .bss.

Где эти сегменты на самом деле являются на самом деле не важно. Когда программа загружена, компоновщик времени выполнения (называемый ld-linux.so в Linux) загрузит всю программу в один или несколько областей памяти, а операционная система отобразит каждый из разделов в свои сегменты памяти , Это предполагает, что платформа имеет сегменты памяти и MMU, как на x86. Многие современные операционные системы также рандомизируют местоположения , в которые загружаются эти разделы, для безопасности. Поэтому при каждом запуске программы данная функция может не иметь один и тот же адрес.

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