Raja Vignesh. R Ответов: 6

Оптимизация кода по размеру в C++


Всем привет,

Мы работаем над инструментом CrossCore, на котором мы разработали встроенное приложение C++.
Наш двоичный размер большой, но нам нужно уменьшить двоичный размер, чтобы поместиться в разных микроконтроллерах!
Есть ли какие-либо методы в C++, которые действительно помогают нам уменьшить двоичный размер?
Компилятор, который мы используем, - это GCC.
Пожалуйста, помогите нам в этом отношении!

Мы уже пытались

Встроенные функции, виртуальные функции, удаление неиспользуемых переменных и перемещение локальных переменных во внутреннюю область видимости

Но эти методы помогли нам улучшить производительность, а не размер, нам нужно уменьшить размер!

С уважением,
Раджа Прем

Что я уже пробовал:

Всем привет,

Мы уже пытались

-> встроенные функции
-> виртуальные функции
-&ГТ; неиспользуемые переменные удаления
-> перемещение локальных переменных в самую внутреннюю область видимости

Но эти методы помогли нам улучшить производительность, а не размер, нам нужно уменьшить размер!

phil.o

Вы используете много макросов? Макросы могут вызывать накладные расходы на размер, в зависимости от того, как часто они используются и как они определены.

Raja Vignesh. R

Макросы не используются

OxEED0

Используете ли вы STL или другие библиотеки на основе шаблонов? Шаблоны-это генераторы кода времени компиляции, старайтесь избегать их (STL, Boost и т. д.).

6 Ответов

Рейтинг:
2

nv3

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

- Встроенная функция: Это инструмент для того, чтобы сделать ваш код быстрее и вообще сделать ваш код больше!

- Виртуальные функции: не имеют ничего общего с размером кода.

- Удаление неиспользуемых переменных: не уменьшайте размер кода, и компилятор, вероятно, позаботится о них в любом случае.

- Перемещение локальных переменных во внутреннюю область видимости: не имеет ничего общего с размером кода.

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

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

В общем есть две большие проблемы которые потенциально могут взорвать ваш код:

1. библиотеки, которые вы используете-вы не имеете большого влияния там.

2. Использование шаблонов: это может значительно взорвать ваш код, если не будет сделано должным образом.

Также проверьте, по-прежнему ли вы строите в режиме отладки, а не в производственном режиме. Отладочная информация, которую добавляет компилятор, может сделать ваш код в несколько раз больше!

Удачи.


CPallini

5.

CodeWraith

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

nv3

Поэтому я написал "вообще" :-)

Рейтинг:
1

CodeWraith

Похоже, вы пытаетесь запихнуть слишком много кода в слишком мало памяти. Нет никакой стандартной процедуры, которая, несомненно, поможет. Слишком много-это слишком много. Один большой вопрос все еще остается: Является ли ваш vexecutable слишком большим для установки или у вас заканчивается память во время выполнения? Исходя из вашего вопроса, я предполагаю первое.

Попробуйте выполнить следующие шаги, но имейте в виду, что они становятся все более отчаянными и все еще могут оказаться недостаточными для решения проблемы.

1) начните искать избыточность в своем коде. Наличие подобного кода более одного раза, очевидно, является большой тратой времени.

2) просмотрите свой код и попробуйте определить функции, которые генерируют самый длинный код. Попробуйте переписать и оптимизировать их. Используйте различные структуры данных или алгоритмы, которые используют меньше памяти.

3) выбросьте код второстепенных функций, которые могут быть приятными, но не существенными.

4) обсудите новые требования, чтобы сделать больше кода несущественным, а затем выбросьте его.


Рейтинг:
1

den2k88

Цитата:
-> встроенные функции
Плохо: встроенные функции явно увеличивают размер кода в пользу производительности из-за меньшего количества требуемых манипуляций стеком.
Цитата:
-> виртуальные функции
В лучшем случае никакого влияния, на самом деле это немного увеличивает размер кода из-за того, что виртуальным таблицам требуется пространство.
Цитата:
-&ГТ; неиспользуемые переменные удаления
Если они не являются статическими, то при запуске приложения изменяется не размер кода, а объем памяти. Хорошо, но не для того, чего вы хотите достичь.
Цитата:
-> перемещение локальных переменных в самую внутреннюю область видимости
За что же? Объявление переменной не увеличьте размер кода, только объем памяти. Внутри функции все переменные запоминаются в стеке. В лучшем случае, с очень специализированными компиляторами, вы зарабатываете повторное использование адреса стека, чтобы минимизировать объем памяти во время выполнения.

Чтобы минимизировать размер кода, Вы должны:
* Устраните все ненужные статические библиотеки.
* Уменьшите пути вызова и количество промежуточных объектов в иерархии.
* Если возможно, с функциями, имеющими несколько сигнатур, используя только одну из них, чтобы не иметь других вариантов, связанных во время компиляции. Осторожно: одна пропущенная функция добавит свой вариант в связанный файл.
* Посмотрите, есть ли у вашего кроссплатформенного фреймворка опции (обычно в форме #defines) для устранения большинства маршалинговых и промежуточных вызовов при компиляции для конкретного MCU. Кросс-платформенные фреймворки великолепны, но они действительно увеличивают размер кода.
* Исключите любую огромную библиотеку, такую как boost, которая фантастична, но раздута.

Это мои 2 цента,
Денис


Рейтинг:
1

KarstenK

Самой жирной проблемой обычно являются такие ресурсы, как растровые изображения или строки, но вы их не упомянули. Вы использовали фреймворки, такие как библиотеки?

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

Проверьте, что это так не отладочная сборка или с каким-нибудь чрезмерным диагностическим инструментом. Мой главный совет ;-)

Затем подумайте о размере данных, таких как наличие больших буферов или структур. Всегда работайте с указателями и наименьший размер данных.


Рейтинг:
0

k5054

Взгляните на эти предложения здесь: pts.blog: как сделать меньшие двоичные файлы C и C++ [^]


Рейтинг:
0

Patrice T

Цитата:
Но эти методы помогли нам улучшить производительность, а не размер, нам нужно уменьшить размер!

Трудно сказать, не видя кода.
Общая методика уменьшения двоичного размера
- Удаление дубликатов кода: найдите дубликаты кода или почти дубликаты и посмотрите, как вы можете уменьшить количество дубликатов.
Пример: у вас есть сортировка пузырьков и сортировка вставок, есть вероятность, что одна подпрограмма может выполнить эту работу.
- Убедитесь, что код эффективен.

Общая методика уменьшения размера среды выполнения
- При работе с массивами старайтесь по возможности избегать промежуточных копий массивов.

Оптимизация кода-это почти работа сама по себе, найм специалиста может быть вашим решением.