ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

       

Вычисление значений функций на стадии компиляции ("свертка" функций)


Если все аргументы функции – константные значения, то теоретически возвращаемый ей результат можно вычислить еще на стадии компиляции. Рассмотрим следующий пример:

Компиляторы Microsoft Visual C++ и WATCOM всегда выполняют свертку констант в границах одной функции, а вот передачу аргументов они отслеживать не умеют и на с

func(int a, int b)

{

return a+b;

}

main()

{

printf("%x\n",func(0x666,0x777));

}

Несмотря на его тривиальность, предвычислить значение функции func не сможет ни Microsoft C++, ни Borland C++, ни WATCOM!

Причина в том, что единицей трансляции практически всех современных компиляторов является функция. Компилятор выполняет ее синтаксический анализ и генерирует целевой код, инвариантный по отношению к остальным функциям программы. Исключение составляют встраиваемые (in-line) функции, но это – тема отдельного разговора.

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



Содержание раздела