В каком сегменте выделяется память для библиотечных функций? - PullRequest
4 голосов
/ 24 сентября 2010

Способ, которым автоматические переменные / локальные переменные идут в стек, динамически размещаемые объекты / тип данных переходят в кучу; где - память для вызовов библиотечных функций (скажем, printf ()). В каком сегменте?

Ответы [ 2 ]

5 голосов
/ 24 сентября 2010

Статическое связывание

Для статически связанной программы библиотечный код объединяется с приложением, и почти все различия между программой и библиотекой теряются, т. Е. Каждый объект оказывается в том же разделе, что и аналогичный объект в основной программе. ,

Динамическое связывание

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

Авто

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

Локальный не-авто

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

Heap

Наконец, библиотечные подпрограммы будут связаны с одним и тем же malloc() (или чем-то еще), и поэтому все выделения кучи будут выполняться одинаковым образом из одной и той же группы адресов.

1 голос
/ 24 сентября 2010

Библиотечные функции на самом деле не обрабатываются иначе, чем другие модули, с которыми вы связываете: их локальные переменные используют стек, их динамически выделяемые части памяти уходят в кучу.

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