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 игнорирует неиспользуемый код, поэтому обычно наличие этих "лишних" модулей не увеличивает размер скомпилированной программы.
Вот некоторые моменты, которые я получаю по этой ссылке о недостатках неиспользованных единиц
- Более чистый код для поддержки, не нужно беспокоиться о коде, который не используется
- Код из разделов инициализации и завершения в неиспользуемых единицах не связан в
- Компиляция проходит быстрее и быстрее
Самая большая проблема, на мой взгляд, заключается в том, что иногда вы можете быть застигнуты правилами Delphi. Если у вас есть два идентификатора с одинаковым именем в разных единицах, то использование этого имени относится к идентификатору, объявленному в единице, объявленной последней в предложении использования.
Если у вас возникла проблема из-за этого, вы всегда можете полностью указать идентификатор. Мне бы очень хотелось увидеть предупреждения компилятора о том, что вы называете идентификатор, идентификатор которого определяется только этим последним объявлением в правиле определения разделапользователей.