2010-10-27 5 views
3

У меня есть довольно простой вопрос.Накладные расходы DLL

  1. Когда библиотека используется только одним процессом. Должен ли я хранить его как статическую библиотеку?
  2. Если я использую библиотеку как DLL, но ее использует только один процесс. ** Что будет наверху? *

ответ

10

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

Основными «накладными расходами» на самом деле являются альтернативные издержки, а не «накладные расходы». То есть современные компиляторы могут сделать что-то, называемое «оптимизацией всей программы», в котором весь модуль (.exe или .dll) скомпилирован и оптимизирован сразу, во время соединения. Это означает, что компилятор может выполнять такие действия, как настройка вызовов вызовов, встроенных функций и т. Д. Во всех файлах .cpp во всей программе, а не только в одном файле .cpp.

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

+0

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

+0

@Mark: Да, я мог бы подумать о загружаемых с задержкой DLL ... в любом случае, фактические накладные расходы сами по себе малы в любом случае ... –

1

Импортированные функции не имеют накладных расходов, чем виртуальные функции.

3

В DLL есть две накладные расходы. Во-первых, поскольку DLL загружается в память, внутренние адреса должны быть исправлены для фактического адреса, на который загружена DLL, по сравнению с адресами, принятыми компоновщиком. Это можно свести к минимуму путем повторного базирования библиотек DLL. Второе накладное время - это когда загружаются программа и DLL, поскольку вызовы программы в DLL имеют адреса заполненных функций. Эти накладные расходы, как правило, незначительны, за исключением очень больших программ и DLL.

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

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

Смежные вопросы