История изменений
Исправление devsdc, (текущая версия) :
Докину ещё про загрузку только необходимых функций. Как уже сказали выше, нельзя загрузить только необходимые функции, ибо неизвестно, как внутри устроена библиотека. Зато можно загрузить только необходимые библиотеки, если какие-то из прилинкованных библиотек вдруг оказались не нужны.
Динамическая линковка в целом работает как-то так: в ассемблерном коде вместо call f
происходит call [linked_f]
, где f
- это имя функции, а linked_f
- ячейка памяти, куда линкер положит известный только ему адрес загруженной функции f
. Если библиотека уже загружена, в linked_f
лежит адрес загруженной функции. Если же нет, там лежит адрес некоторой «заглушки», которая вызывает линкер с нужными аргументами, и в итоге происходит загрузка нужной библиотеки. В реальности всё происходит чуть-чуть по-другому, но общая суть та же.
Таким образом, если ни одна функция из библиотеки не была ни разу вызвана, то и библиотека не загрузится. Это иногда даёт выигрыш, например, если загружаемые библиотеки весьма жирные, а программа по каким-то причинам завершилась очень быстро (например, ей передали некорректные аргументы при запуске, и она сразу определила это и завершилась с ошибкой). Но в целом это практически ничего не ускоряет.
Это я всё про линукс, если что. Не знаю, как оно там под виндой.
Исходная версия devsdc, :
Докину ещё про загрузку только необходимых функций. Как уже сказали выше, нельзя загрузить только необходимые функции, ибо неизвестно, как внутри устроена библиотека. Зато можно загрузить только необходимые библиотеки, если какие-то из прилинкованных библиотек вдруг оказались не нужны.
Динамическая линковка в целом работает как-то так: в ассемблерном коде вместо call f
происходит call [linked_f]
, где f
- это имя функции, а linked_f
- ячейка памяти, куда линкер складывает известные только ему адреса загруженных функций. Если библиотека уже загружена, в linked_f
лежит адрес загруженной функции. Если же нет, там лежит адрес некоторой «заглушки», которая вызывает линкер с нужными аргументами, и в итоге происходит загрузка нужной библиотеки. В реальности всё происходит чуть-чуть по-другому, но общая суть та же.
Таким образом, если ни одна функция из библиотеки не была ни разу вызвана, то и библиотека не загрузится. Это иногда даёт выигрыш, например, если загружаемые библиотеки весьма жирные, а программа по каким-то причинам завершилась очень быстро (например, ей передали некорректные аргументы при запуске, и она сразу определила это и завершилась с ошибкой). Но в целом это практически ничего не ускоряет.
Это я всё про линукс, если что. Не знаю, как оно там под виндой.