Библиотека сайта rus-linux.net
Цилюрик О.И. Linux-инструменты для Windows-программистов | ||
Назад | Компиляция и сборка приложений | Вперед |
Как это всё работает?
Теперь, когда мы умеем связать свою программу с
любыми библиотеками, вернёмся к вопросу: что происходит при
использовании того или иного сорта библиотеки, и в чём разница?
Статическая библиотека не представляет из себя по структуре ничего
более, чем просто линейный набор N объектных модулей, снабжённых
каталогом для их поиска (чем и занимается утилита ar
).
При компоновке пользовательского процесса, из библиотеки выбираются
(по внешним ссылкам) и извлекаются M требуемых программе объектных
модулей, и сатически собираются в единое целое (часто M<<N).
Объём полученного в результате процесса (занимаемая при его загрузке
память) пропорционален объёму M модулей (но не N)! Если некоторая
функция xxx()
используется несколькими собираемыми процессами в проекте P1, P2, P3,
... PK, то экземпляр объектного модуля этой функции будет
прикомпонован к каждому процессу, и если, вдруг, потребуется
загрузить одновременно все эти процессы проекта, то они потребуют под
загрузку функции xxx()
в K раз больше памяти, чем сам размер модуля.
Автоматически загружаемая динамическая библиотека (наиболее частый на практике случай), если она не загружена в памяти, загружается при загрузке использующего её процесса. Если к загрузке этого процесса библиотека уже загружена, то новый экземпляр уже не загружается, а используется ранее загруженный; в этом случае только увеличивается число ссылок использования библиотеки (внутренний параметр). Автоматически загружаемая библиотека не может быть выгружена из памяти до тех пор, пока её счётчик ссылок использования не нулевой. Обратим внимание на то, что в отличие от того, что описано относительно статической библиотеки, если процессу нужен хотя бы одна точка входа из библиотеки, будет загружен весь объём N объектных модулей.
При загрузке по требованию, сама динамическая библиотека ведёт себя в точности также. Но по исполнению, со стороны вызывающего приложения, это очень похоже на оверлейную загрузку (мы это ещё обсудим позже). На этот способ стоит обратить особое внимание, так он является готовым механизмом для создания динамических плагинов к проекту.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Библиотеки: построение | Конструктор и деструктор |