Мой объектный файл C ++ слишком большой - PullRequest
4 голосов
/ 22 января 2009

Я работаю над программой на C ++, и скомпилированный объектный код из одного файла из 1200 строк (который инициализирует довольно сложный конечный автомат) составляет почти мегабайт. Что может сделать файл таким большим? Есть ли способ найти то, что занимает место внутри объектного файла?

Ответы [ 5 ]

9 голосов
/ 22 января 2009

Может быть несколько причин, когда объектные файлы больше, чем они должны быть как минимум:

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

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

7 голосов
/ 22 января 2009

(я предполагаю, что у вас есть оптимизация и отключение мертвого кода).

Включите опцию вашего компоновщика «создать файл карты» и проверьте вывод.

Распространенными виновниками являются макросы / шаблоны, которые генерируют большие объемы кода и большие глобальные объекты.

5 голосов
/ 22 января 2009

Возможно, некоторые экземпляры шаблона (особенно std::iostream s) и, возможно, обширное встраивание (то есть классы, которые полностью определены в заголовке). Однако в чем проблема с 1-мегабайтным объектным файлом? Во время связывания это может привести к крошечному двоичному файлу. У меня есть проект с 20 МБ объектных файлов, который, например, связан в двоичный файл 700 КБ.

Обновление: может быть также некоторый большой статический массив / объект. Кроме того, в MSVC ++ и GCC вы можете посмотреть на сгенерированную сборку для файла, который может дать вам несколько советов (в случае GCC это g++ -S foo.cpp, для MSVC ++ - '/ FAs * ). Либо вы увидите много экземпляров шаблонов, и в этом причина. Если нет, то это размер объекта static объектов.

0 голосов
/ 23 января 2009

Другой возможной причиной является Link-Time Code Generation, опция VC ++. Это перемещает серверную часть компилятора в компоновщик. Это позволяет улучшить оптимизацию, но теперь объектный файл должен содержать все внутренние структуры данных, обычно передаваемые между front- и backend.

0 голосов
/ 22 января 2009

Вот макрос, который я использую, чтобы увидеть значения времени компиляции:

template <size_t N> struct compile_time_number { private: typedef int check; };
#define compiler_check_number(N) ((compile_time_number< N >::check)0)

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

Edit: так как никто, кажется, не понимает этого, я поясню: способ использовать это, чтобы добавить compiler_check_number(sizeof(<insert struct or global variable here>)). Компилятор выдаст размер переменной или структуры как ошибку времени компиляции. Очень редко код является причиной огромного объектного файла.

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

...