Какие есть методы оптимизации размера программы (исполняемого кода)?
Как узнать какая часть кода вносит в итоговый размер программы больший вклад? Можно ли ставить такой вопрос?
Требуется оптимизировать размер программы для размещения в контроллере (ISP-DAS, процессор 8086). Размер "диска" ограничен. На какие механизмы оптимизации сделать упор (что вносит больший вклад)?
Первое что напрашивается - это комментировать часть кода и смотреть на итоговый размер. Но это можно сделать не всегда, т.к. бывает зависимость одного участка кода от другого. Наверно можно поиграть с опциями компилятора. Вариант, но он, если можно так выразится, интегральный, не позволяет выделить частности с которыми надо поработать.
Наибольший вклад обычно вносят библиотеки, подключенные статически.
Рассмотреть возможность динамической линковки, если библиотеки есть в системе, либо более легких библиотек, если они необходимы. Ну, и выкинуть то, что не используется.
В самом клиническом случае - брать код из самих библиотек, если они открыты.
А компилятор сам не отсеивает не используемые части из библиотек? Считал, что если не используется функция в проекте, то она и не будет включена в состав исполняемого файла.
Подозреваю, что нет. Это ему, получается, нужно выяснить все дерево зависимостей для каждой функции - какие можно выкинуть, а какие понадобятся тем функциям, которые вызывают функции, которые вызываются из кода. Фактически это перекомпиляция библиотеки в зависимости от того кода, который ее использует.
Думаю понял. Т.е. если мы подключаем (include) файл заголовков, то возможны два варианта:
1) вместе с *.h файлом находится исходный код (*.с) - в этом случае лишнее откидывается.
2) вместе с *.h файлом находится объектный файл - в этом случае он присоединяется к проекту целиком.
Так правильно?
Боюсь, примерно так. И оптимизации компилятор проводит на предыдущей стадии (только с вашим кодом), так что если библиотека была скомпилирована в объектные файлы без всяких оптимизаций, она весит больше, чем могла бы.
Дополню коллег. Если речь идет про C/C++(судя по тегам так). Смотрите на опции вашего компилятора. Приведу аналогии: компилятор gcc/clang, использует ключ компиляции -Os (s от слова size. То есть оптимизация по размеру). Для студии это будет /O1.
Есть вещи которые сильно "раздувают" код. Например использование шаблонов может сильно увеличить размер вашего бинарника, т.к. каждая инстанциация шаблона - это новый класс.
Adamos: Которые используются - те и раздувают. Насколько я осведомлен, многие люди, которые пишут под железки, избегают использования STL. Писали же люди как-то до шаблонов? Так и пишут.
Заменяем статический полиморфизм на динамический и живем. Разговор же не про эстэтику и скорость, а про размер бинаря. Да менее эстетчно. Да менее быстро, но бинарник меньше.
У STL просто здоровенный оверхед по сравнению с простыми массивами, там куча вспомогательных классов для создания абстракции. Проблема не в использовании шаблонов.
Ко всему выше сказанному, добавлю, что на итоговый размер приложения влияет ещё и сам компилятор. Например откомпилированные в clang программы могут весить меньше, чем откомпилированные в gcc.
Изначально надо делать так, чтобы код не был сплошным монолитом, а представлял собой модульные участки, которые при необходимости можно отключать ($ifdef).
Это кстати может помочь и в локализации трудноустранимых ошибок, можно отключать отдельные части.