На каком уровне применяется оптимизация компилятора?
Мой вопрос в том, на каком уровне компилятор применяет оптимизацию. Это на уровне разных файлов кода? Если это так, то разве это не более неэффективно, чем, скажем, если бы это применялось по всему коду? Во-вторых, что происходит, когда один из исходных файлов был скомпилирован без оптимизации, а затем связан с одним с оптимизацией уровня-O3?
Меня особенно интересует, как gcc справляется с такими вещами.
1 ответ:
Отдельные единицы перевода могут быть скомпилированы с отдельными флагами оптимизации, что, как правило, не является проблемой. Оптимизация во время компиляции обычно влияет только на видимый код в пределах одного TU.
Исключением из этого правила является флаг
-fwhole-program
, который указывает, что ваш исходный код составляет всю программу и допускает более агрессивную оптимизацию:gcc -o prog *.c -O3 -fwhole-program -s
Тем не менее, GCC недавно ввел еще один уровень оптимизации в link time; чтобы использовать это, компилируйте все с помощью
-flto
(GCC 4.6). Однако это также не зависит от флагов оптимизации для каждого TU:Наконец, вы также можете указать независимую опциюgcc -c module1.c -flto -O2 gcc -c module2.c -flto -O3 -fno-strict-aliasing gcc -c module3.c -flto -O0 gcc -c module4.c -O1 gcc -o prog module*.o -flto -s
-O*
на этапе компоновки, но я не знаю, имеет ли это какое-либо значение.Также обратите внимание, что предварительно скомпилированные заголовочные файлы не могут быть независимо оптизированы; PCH допустим только в том случае, если он был скомпилирован с теми же настройками оптимизации, что и TU.