Вынесение инвариантного кода за пределы цикла
Инвариантным называется код, не изменяющийся в ходе выполнения цикла. А раз так, – то какой смысл выполнять его в каждой итерации – не лучше ли вынести такой код за пределы цикла?
Рассмотрим следующий пример:
for(a=0;a<(b*2);a++)
printf("%x\n",a*(b/2));
Выражения (b*2) и (b/2) очевидно представляют собой инвариант, и оптимизированный код будет выглядеть так:
tmp_1=b*2;
tmp_2=b/2;
for(a=0;a<tmp_1;a++)
printf("%x\n",tmp_2+=tmp_2);
Это экономит одну операцию деления и две операции умножения на каждую итерацию, что очень и очень неплохо!
Компиляторы Microsoft Visual C++ и WATCOM успешно распознают инвариантный код и выносят его за пределы цикла, а вот Borland C++ увы, нет.