На каком уровне применяется оптимизация компилятора? - PullRequest
4 голосов
/ 26 июля 2011

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

Мне особенно интересно узнать, как gcc обрабатывает такие вещи.

1 Ответ

5 голосов
/ 26 июля 2011

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

Исключением из этого правила является флаг -fwhole-program, который указывает, что ваш исходный код составляет всю программу и допускает более агрессивную оптимизацию:

gcc -o prog *.c -O3 -fwhole-program -s

Тем не менее, GCC недавно представил еще один уровень оптимизации во время link ; чтобы использовать это, скомпилируйте все с -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* на этапе соединения, но я не знаю, имеет ли это какое-либо значение.

Также обратите внимание, что предварительно скомпилированные заголовочные файлы не могут быть независимо optmizied; PCH имеет право только в том случае, если он был скомпилирован с теми же настройками оптимизации, что и TU.

...