Использование boost:: serialization значительно увеличивает размер двоичного файла

#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:

  1. Поместите свой код с вызовами сериализации в отдельные модули, скомпилируйте их в большие объектные файлы.
  2. Используйте для них strip —strip-debug, чтобы удалить только эти большие символы отладки (которые вам обязательно понадобятся позже для отладки сбоев внутри библиотеки сериализации 🙂
  3. Прибыль!Свяжите разделенные оболочки и необрезанные другие модули вместе.

Комментарии:

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*