Поддерживает ли компоновщик C ++ Builder связывание на уровне функций?

Я почти два года работаю над различными проектами, написанными на C ++ Builder. За это время я заметил несколько вещей, связанных с размером получаемого исполняемого файла. Я пытаюсь описать это на двух примерах:

1. Сегодня я конвертировал один проект из C ++ Builder 6 в C ++ Builder XE4. Вот сравнение размеров DLL:

Old DLL      531 968 B

New DLL    3 422 720 B (or more than 6x larger than old one!)

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

2. Я добавил в проект VCL, написанный на C ++ Builder XE2, несколько файлов из проекта JCL (библиотека кодов JEDI). В моем коде не создан объект из JCL, поэтому я думаю, что компоновщик не должен связывать новые методы, даже когда они являются частью кода. Тем не менее, двоичный размер увеличился с 17 900 000 до 19 300 000. У меня нет точных цифр, потому что были и другие незначительные изменения. Небольшая часть этого увеличения может быть связана с привязкой файла ресурсов JclUnicode.res, размер которого составляет 170 кБ. Тем не менее это согласуется с моим многолетним опытом, что при добавлении какого-либо внешнего компонента в проект результирующее изменение размера двоичного файла не подходит, если мы сравниваем его с новыми функциями для конечного пользователя.

У меня есть подозрение, что в результирующем двоичном коде есть большая часть кода, которая никогда не вызывается. К сожалению, я не знаю, как проверить эту гипотезу. Есть ли какой-нибудь инструмент, который может анализировать полученный бинарный файл на предмет никогда не использованного кода / данных? Поддерживает ли компоновщик C ++ Builder связывание на уровне функций? Это очень практичный вопрос, если принять во внимание время, необходимое для чтения исполняемого файла с жесткого диска в память, и объем оперативной памяти, занятой программой. Мой коллега, занимающийся разработкой встроенного программного обеспечения, рассказал мне историю о том, как, удалив никогда не вызываемые функции из встроенного программного обеспечения, сократил его размер на 80%.

2

Решение

Там были многочисленные дискуссии о Форумы Embarcadero связанные с увеличением размеров исполняемых файлов в различных версиях. Между BCB6 и XE4 произошли существенные изменения в RTL / VCL. Переключение на Unicode, внедрение Delphi Generics и Extended RTTI и т. Д. Все они влияют на размер файла. Особенно в C ++ Builder, который не может отфильтровать неиспользуемый код RTL / VCL так же хорошо, как Delphi, особенно в частности Enhanced RTTI, но также и Delphi Generics не очень хорошо оптимизированы по сравнению с шаблонами C ++.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]