Отказ от ответственности : Я кузнечик из Linux-fu, поэтому здесь и там (или просто везде) могут быть некоторые неточности. Но общая идея должна быть относительно правильной. И если это не так, я уверен, что хорошие ТАК люди быстро поправят меня. : -)
Да, и предоставленные мной ссылки ориентированы на Windows. Буду признателен, если кто-нибудь сможет предоставить правильные Linux-ориентированные ссылки.
Краткий ответ: Возможно. Однако, даже если это так, разница в производительности действительно незначительна.
Когда вы связываете статическую библиотеку, компилятор генерирует код для непосредственного выполнения всех вызовов функций. Когда процесс создан и этот код выполнен, вызов функции является простой инструкцией вызова.
Когда вы используете динамическую библиотеку, стоимость зависит от того, используете ли вы динамическое связывание во время загрузки или динамическое связывание во время выполнения .
При динамическое связывание во время загрузки компилятор по-прежнему генерирует код для непосредственного вызова функции, как если бы она была статически связана. Когда загрузчик процесса загружает DLL, он вызывает компоновщик времени выполнения для исправления памяти процесса, так что эти вызовы идут непосредственно к фактическим реализациям функций. Это должно произойти до того, как будет сделан любой вызов функции из загруженной библиотеки. в Windows это выполняется загрузчиком NT DLL, который вызывает LoadLibrary для DLL во время инициализации процесса. В Linux это выполняется компоновщиком среды выполнения, ld-linux.so.
При /DELAYLOAD
динамическое связывание во время загрузки , процесс по сути такой же, за исключением того, что компилятор генерирует код для вызова небольших заглушек, который проверяет, загружена ли библиотека и, если нет, вызовет загрузчик NT DLL. Таким образом, DLL будет загружаться по требованию, и загрузчик процесса не должен загружать ее во время инициализации процесса. Это приводит к более быстрому запуску процесса, но производительность вызова остается той же. (Обратите внимание, что задержка загрузки страдает от других недостатков)
Я не знаю, есть ли соответствующая поддержка Linux, но я был бы удивлен, если бы не было.
С динамическим связыванием во время выполнения ваш код поддерживает указатели функций и решает, когда загрузить библиотеку. В Windows он должен использовать LoadLibrary и GetProcAddress, в Linux это dlopen, dlsym и dlclose. В любом случае последствия для времени запуска процесса такие же, как для задержки-загрузки динамическое связывание во время загрузки ; однако разыменование указателя при каждом вызове метода добавляет небольшую незначительную стоимость. (Хотя, если вы знаете, что делаете, вы можете сойти с ума и исправить вашу память процесса, чтобы избежать разыменования указателя. Однако попытка сделать это правильно на порядок больше, чем полезная выгода, которую вы получите за выполнение она.)