Comments 2
Примеров бы много и разных.
Пока получается, что оптимизатор может выкинуть неиспользуемые функции.
Или, например, зная, что некая функция вызывается только с определёнными аргументами (анализ всех единиц трансляции?), оптимизатор может выкинуть ряд проверок в уже скомпилированном коде?
Согласен, примеров маловато.
Суть в том, что оптимизатор с включённым LTO применят те же оптимизации, что и без него. Разница в том, что ему доступно больше информации.
В обычном режиме у оптимизатора часто нет возможности исследовать определения символов, так как они находятся в других единицах трансляции. Кроме того, при исследовании самих символов (их определений), у него нет информации о том, как и где они используются.
Оптимизатор может не только удалять неиспользуемые символы. Он так же применяет весь набор оптимизаций (по возможности), но в рамках всего проекта.
Например, ничего не мешает ему встраивать тела функций, и потом в них раскручивать циклы, удалять ненужные проверки, или целые ветки неиспользуемого (или бессмысленного) кода. Или, например выполнять Compile Time вычисления.
Без включенного LTO это тоже будет работать, но только если все определения будут находиться в одной и той же единице трансляции.
Межмодульный анализ C и C++ проектов в деталях. Часть 1