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

       

Удаление лишних вызовов функций


Удаление лишних выражений ни в коем случае нельзя распространять на удаление функций! (Во всяком случае, без дополнительных ухищрений, разговор о которых выход за рамки этой статьи).

Рассмотрим следующий пример:

c=func_1(0x666,0x777);

c=func_2(0);

printf("%x\n", c);

На первый взгляд, от вызова функции func_1 можно безболезненно избавиться – возращенное ею значение никак не используется, и переменной 'c' тут же присваивается результат работы func_2, который и выводится на экран. Но задумайтесь: что произойдет, если функция func_1

помимо возращения значения делает и другую работу? Ну, скажем, записывает переданные ей аргументы в дисковый файл. Правильно, - удаление этой функции нарушит нормальную работу программы!

Таким образом, оптимизирующий компилятор не должен сокращать вызовы функций, однако, он может (и должен) не присваивать возращенное значение переменной, если оно действительно нигде не используются (см. "Удаление лишних присвоений").

Ни один из трех рассматриваемых компилятором не удаляет "лишние" вызовы функций.



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