В чем разница в gcc между lto и fat-lto-objects
Я попытался скомпилировать мой исходный код на ассемблере с помощью следующих флагов:
1. -flto
2. -flto -ffat-lto-objects
3. -flto -fno-fat-lto-objects
Третий обеспечивает оптимизированный slim
Код LTO, как написано в документации, но я не вижу никакой разницы в выходном файле сборки между первым и вторым, почему?
ОС: Linux
Компилятор: GCC 4.7
2 ответа
Разница между толстыми и нежирными объектными файлами заключается в том, что толстые объектные файлы содержат как промежуточный язык, так и нормально скомпилированный код. Во время компоновки, если вы вызываете компилятор без -flto, толстые объекты будут обрабатываться как обычные объектные файлы (и информация LTO отбрасывается), в то время как тонкие объекты будут инициировать оптимизаторы LTO, потому что без них невозможно обработать их.
Если вы скомпилируете и скомпонуете с -flto, то и толстые, и тонкие объекты должны давать вам один и тот же двоичный файл, только тонкие объекты будут меньше и быстрее компилироваться, потому что вы избежите создания избыточного кода.
Наверное, это будет кому-то полезно
Здесь написал следующее:The current implementation only produces “fat” objects, effectively doubling compilation time and increasing file sizes up to 5x the original size
Так что, как мне кажется, это главная причина.