#c #linux #gcc #boost #boost-serialization
#c #linux #gcc #повышение #boost-сериализация
Вопрос:
Я использую в своем приложении довольно сложные структуры данных (в основном с использованием контейнеров STL) и сериализую их с помощью Boost (версия v1.34).
Всякий раз, когда я компилирую с использованием символов отладки (gcc -g), результирующий исполняемый файл становится огромным — около 25 МБ. Удаление всех символов отладки уменьшает размер до ~ 3 МБ.
Я попытался определить причину увеличения размера, и, похоже, причиной являются методы сериализации. В частности, объектные файлы для модулей, которые вызывают сериализацию (код типа «oarchive << MyObject»), большие, и закомментирование части сериализации значительно уменьшает размер.
Возможно ли предотвратить генерацию этих символов или удалить их выборочно?
Удаление всех символов — это не вариант, поскольку мне нужны символы отладки для моего собственного кода.
Комментарии:
1. Да, шаблоны имеют тенденцию значительно увеличивать размер символов gebug. На самом деле вы ничего не можете с этим поделать.
2. И почему это проблема?
3. Текущая цена: жесткий диск объемом 2 ТБ 100 долларов США 🙂
4. Потому что мы используем двоичные файлы с символами отладки на производственных серверах, и довольно медленно доставлять большие файлы в репозиторий управления пакетами и развертывать их оттуда. Кроме того, жесткий диск сервера объемом 2 ТБ немного дороже 🙂 .
5. Исполняемые файлы с символами отладки обычно легко сжимаются.
Ответ №1:
- Поместите свой код с вызовами сериализации в отдельные модули, скомпилируйте их в большие объектные файлы.
- Используйте для них strip —strip-debug, чтобы удалить только эти большие символы отладки (которые вам обязательно понадобятся позже для отладки сбоев внутри библиотеки сериализации 🙂
Прибыль!Свяжите разделенные оболочки и необрезанные другие модули вместе.
Комментарии:
1. Да, спасибо. Я просто изменил свой makefile, чтобы символы отладки не генерировались для этих модулей.
Ответ №2:
strip -w -K '!*serialization*'
Просто, нет необходимости в гимнастике во время компиляции. Вот улучшение, которое это внесло в мой двоичный файл:
# ls -lh EnrollGUI
-rwxr-xr-x. 1 root root 17M Aug 8 2012 EnrollGUI*
# strip -w -K '!*serialization*' EnrollGUI
# ls -lh EnrollGUI
-rwxr-xr-x. 1 root root 1.1M Aug 8 2012 EnrollGUI*