Или есть некоторые оптимизации, которые можно выполнить только во время компиляции (и, следовательно, работать только в единицах компиляции)? Я спрашиваю, потому что в C единицей компиляции является исходный файл, и я пытаюсь понять, есть ли какая-либо причина не разбивать исходный код на отдельные файлы в некоторых обстоятельствах (например, оптимизация, которую можно было бы сделать, если бы весь исходный код были в одном файле не делалось).
Можно ли выполнить все оптимизации времени компиляции с оптимизацией времени компоновки?
Ответы (2)
Типичная (упрощенная) компиляция может выглядеть так:
1) Pre-process
2) Parse code to internal representation
3) Optimize code
4) Emit assembly language
5) Assemble to .o file
6) Link .o file to a.out
LTO обычно достигаются путем сброса внутреннего представления компилятора на диск между шагами 2 и 3, а затем во время последней ссылки (шаг 6) возвращаются и выполняют шаги 3-5. Однако это может зависеть от компилятора и версии. Если он будет следовать этому шаблону, вы увидите LTO, эквивалентный оптимизации времени компиляции.
Тем не мение ...
Наличие очень больших исходных файлов может раздражать — Emacs начинает задыхаться от исходных файлов >10 МБ.
Если вы находитесь в многопользовательской среде разработки, в зависимости от вашего SCM у вас могут возникнуть большие проблемы, если несколько инженеров работают над одним и тем же файлом.
Если вы используете распределенную систему сборки, вы выполняете параллельную компиляцию. Таким образом, если для компиляции и оптимизации файла требуется 1 секунда, и у вас есть 1000 файлов и 1000 агентов сборки, общее время компиляции составляет 1 секунду. Если вы делаете всю свою оптимизацию для всех 1000 файлов во время финала, у вас будет 999 агентов, которые будут простаивать, а 1 агент потратит целую вечность на всю вашу оптимизацию.
академический пример:
main()
{
int i;
for (i = 0; i < MAX; i++) {
fun(i);
}
}
fun(int i)
{
if (i == 0) {
doSomething();
}
}
если fun
находится в той же единице компиляции и включен анализ потока данных, цикл foor может быть оптимизирован для вызова одной функции.
НО: я бы остался с комментарием MooseBoys.