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

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


"Сверткой" констант, вопреки логике и здравому смыслу, разработчики компиляторов называют процесс аналогичный их "развертке", за тем исключением, что "свертка" охватывает весь ансамбль константных выражений, а не одну константную переменную в отдельности.

Логично: если все члены выражения (подвыражения) – константные переменные, то и значение выражения – тоже константа.

Например:

int a=0x666;

int b=0x777;

int c=b-a;

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

c=a+b;

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

Значение переменной 'c' инвариантно относительно входных данных программы и его можно вычислить еще на этапе трансляции, удалив переменные 'a' и 'b', и заменив 'c' ее фактическим значением. В результате всех преобразований оптимизированный код программы будет выглядеть так:

printf("%x\n", 0x111);

printf("%x\n", 0xDDD);

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

Компиляторы Microsoft Visual C++ и WATCOM всегда выполняют свертку констант, а вот Borland  C++ этого делать не умеет.



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