На каком уровне применяется оптимизация компилятора?


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

Меня особенно интересует, как gcc справляется с такими вещами.

1 4

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.