Один исходный код против нескольких файлов + библиотек - PullRequest
4 голосов
/ 07 июня 2011

Как сильно влияет наличие нескольких файлов или скомпилированных библиотек по сравнению с перебрасыванием всего (> 10000 LOC) в один источник в конечном двоичном файле?Например, вместо того, чтобы отдельно связывать библиотеку Boost, я вставляю ее код вместе с исходным кодом в один гигантский файл для компиляции.И по той же линии, вместо того, чтобы подавать несколько файлов в gcc, вставлять их все вместе и выдавать только один файл.

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

Конечно, может быть только оптимизация по времени соединения (я могу ошибаться), но есть ли большая разница между возможностями оптимизации?

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

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

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

  • Встраивание
  • Постоянное распространение
  • анализ мод / реф
  • Анализ псевдонима
  • Прямая замена
  • Обычное распространение атрибута ключа
  • Частичное устранение мертвых вызовов
  • Продвижение данных таблицы символов
  • Устранение мертвых функций
  • Анализ всей программы

Поддержка GCCэтот вид оптимизации.

Эта межпроцедурная оптимизация может использоваться для анализа и оптимизации вызываемой функции.

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

2 голосов
/ 07 июня 2011

Обратите внимание, что некоторые современные компиляторы (clang / LLVM, icc и недавно даже gcc) теперь поддерживают оптимизацию по времени соединения (LTO), чтобы минимизировать эффект отдельной компиляции.Таким образом, вы получаете преимущества отдельной компиляции (сопровождение, более быстрая компиляция и т. Д.), А также преимущества анализа всей программы.

Кстати, похоже, что gcc поддерживает -fwhole-program и --combine с версии4.1.Однако вы должны передать все исходные файлы вместе.

Наконец, поскольку BOOST - это в основном заголовочные файлы (шаблоны), которые #include, вы ничего не получите, добавив их в свой исходный код..

...