Вычисление значения переменных на стадии компиляции ("свертка" констант)
"Сверткой" констант, вопреки логике и здравому смыслу, разработчики компиляторов называют процесс аналогичный их "развертке", за тем исключением, что "свертка" охватывает весь ансамбль константных выражений, а не одну константную переменную в отдельности.
Логично: если все члены выражения (подвыражения) – константные переменные, то и значение выражения – тоже константа.
Например:
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++ этого делать не умеет.