Вносит ли разбиение кода C ++ на несколько блоков перевода накладные расходы на размер исполняемого файла? - PullRequest
4 голосов
/ 03 марта 2010

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

Конечно, самым простым решением для уменьшения количества объектного кода, связанного с конечным исполняемым файлом, было бы разделить блоки перевода так, чтобы я получал больше файлов .obj с меньшим количеством объектного кода. Я даже могу пойти на крайние меры - поместить каждую функцию в отдельную единицу перевода.

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

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

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

Вещи, которые могут повлиять на ваш окончательный размер EXE (не исчерпывающий список):

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

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

2 голосов
/ 03 марта 2010

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

1 голос
/ 03 марта 2010

Нет. Я думаю, что вам нужно либо перекомпилировать вашу статическую библиотеку как общую библиотеку, либо использовать что-то вроде: strip -g -s -R .comment для удаления кода, который не используется.

...