Delphi: Каковы недостатки использования неиспользуемых единиц, перечисленных в предложении использования?

Я использую очиститель cnPack Uses, но каковы недостатки использования бесполезных юнитов?

Я знаю некоторые из них:

1) конечно, если единица никогда не используется во всем проекте, будет бесполезное потребление ресурсов

2) понимание кода даст бесполезные результаты

3) понимание кода будет медленнее

Но представьте себе простой случай:

  • У меня есть проект с двумя формами, я использую StrUtils в одной из них, но я объявил StrUtils в обеих из них... Есть ли какие-либо недостатки в использовании памяти в этом случае или нет?

3 ответа

Решение

Нет. В целом, smartlinking работает так:

  • Если вы где-то используете модуль, по крайней мере, код инициализации и финализации связан с.
  • В принципе, только те функции / методы, которые вы фактически используете, прямо или косвенно из основной программы (.dpr), связаны в.
  • Некоторые биты, которые достижимы через RTTI, также будут связаны в. Правило состоит в том, что RTTI для перечислений всегда связан (если вы используете перечисление), и что (как только вы создаете класс), все, что опубликовано или доступно через опубликованные свойства связан в.
  • Имейте в виду, что инициализация неиспользуемых модулей может привести к созданию dll или даже целых каркасов dll (например,.NET), что может быть ненужным осложнением развертывания.
  • (Как говорит Роб в комментариях) Ресурсы - это еще один фактор, который всегда связан, поскольку из-за их использования во время выполнения компилятор не может определить, используются они или нет.

Вывод: окончательный размер.exe определяется

  • в основном чем-то, что достижимо вышеуказанными корнями (основная программа, инициализация, финализация,RTTI классов, которые могут быть построены),
  • некоторые биты, которые всегда связаны, если блок используется (ресурсы, определенные формы RTTI, такие как перечисления),
  • языковые помощники в RTL, такие как подпрограммы помощника по аннулированию, большинство из них в System, некоторые могут быть в вариантах.
  • Некоторое относительно небольшое внутреннее администрирование программы (например, таблицы с модулями, определяющими порядок инициализации / финализации), таблицы, необходимые для обработки ресурсов, связывание DLL и т. Д.
  • Отладочная информация (если TD32 включен)
  • Настройки компилятора, такие как оптимизация и проверки во время выполнения, также слегка влияют на размер двоичного файла.
  • Бинарное сжатие использует как UPX. Я не рекомендую их, хотя, по моему опыту, они постоянно вызывают проблемы.

Free Pascal примерно работает одинаково, значения по умолчанию просто разные; Отладка в настоящее время почти всегда "в двоичном формате" (например, TD32), а в моментальных снимках smartlinking по умолчанию отключен. (хотя в официальных релизах он включен).

Более того, нельзя упускать из виду величину. Strutils в своем полном объеме, как 15 КБ макс.

(обновление 2011-11-01)

Получил замечание от sb на этот ответ, которым я хотел поделиться:

По сути, он сомневается в замечании, что перечисления всегда связаны между собой. Может быть, регистрация класса, у которого есть опубликованное свойство типа перечисления, затягивает их. Рассуждения имеют смысл, но я еще не проверял это. Таким образом,RTTI enum напрямую может быть связан, только если typeinfo(tenumtype) запрашивается где-то, или если он используется в опубликованном разделе используемого класса. (напрямую или typeinfo(theclass) запрашивается)

Интеллектуальный компоновщик Delphi игнорирует неиспользуемый код, поэтому обычно наличие этих "лишних" модулей не увеличивает размер скомпилированной программы.

Вот некоторые моменты, которые я получаю по этой ссылке о недостатках неиспользованных единиц

  1. Более чистый код для поддержки, не нужно беспокоиться о коде, который не используется
  2. Код из разделов инициализации и завершения в неиспользуемых единицах не связан в
  3. Компиляция проходит быстрее и быстрее

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

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

Другие вопросы по тегам