Сишные трюки от мыщъха


Регистровые ре-ассоциации


Для преодоления катастрофической нехватки регистров, некоторые компиляторы стремятся совмещать счетчик цикла с указателем на обрабатываемые данные. Код вида "for(i = 0; i < n; i++) n+=a[i];" трансформируется оптимизатором в "for (p= a; p < &a[n]; p++) n+=*p;" Экономия налицо! Вместо четырех переменных после преобразования остались всего лишь три!

Впервые (насколько мне известно) эта техника использовалась в компиляторах фирмы Hewlett-Packard, где она фигурировала под термином register reassociation. А что же конкуренты?! Возьмем следующий код (кстати, выдранный из документации на HP компилятор):

int a[10][20][30];

void example (void)

{

       int i, j, k;

       for (k = 0; k < 10; k++)

              for (j = 0; j < 10;j++)

                     for (i = 0; i < 10; i++)

                           a[i][j][k] = 1;

}



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