Jump to content

Индукционная переменная

В информатике индукционная переменная — это переменная, которая увеличивается или уменьшается на фиксированную величину на каждой итерации цикла или является линейной функцией другой индукционной переменной. [1]

Например, в следующем цикле i и j являются индукционными переменными:

для   (  я знак   равно   0  ;   я   <   10  ;   ++  я  )   {      j   знак равно   17   *   я  ;  } 

Применение для снижения прочности

[ редактировать ]

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

j   =   -17  ;  для   (  я   знак равно   0  ;   я   <   10  ;   ++  я  )   {      j   знак равно   j   +   17  ;  } 

Эта оптимизация является частным случаем снижения прочности .

Заявка на снижение давления регистра

[ редактировать ]

В некоторых случаях можно отменить эту оптимизацию, чтобы полностью удалить переменную индукции из кода. Например:

внешняя   int   сумма  ;  int   foo  (  int   n  )   {      int   j знак   равно   5  ;      для   (  int   я   знак равно   0  ;   я   <   п  ;   ++  я  )   {          j   +=   2  ;          сумма   +=   j  ;      }      вернуть   сумму  ;  } 

Цикл этой функции имеет две переменные индукции: i и j. Любой из них можно переписать как линейную функцию другого; следовательно, компилятор может оптимизировать этот код, как если бы он был написан

внешняя   int   сумма  ;  int   foo  (  int   n  )   {      for   (  int   i   =   0  ;   i   <   n  ;   ++  i  )   {          sum   +=   5   +   2   *   (  i   +   1  );      }      вернуть   сумму  ;  } 

Замена индукционной переменной

[ редактировать ]

Индукционная замена переменных — это преобразование компилятора, позволяющее распознавать переменные, которые могут быть выражены как функции индексов охватывающих циклов, и заменять их выражениями, включающими индексы циклов.

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

Пример:

Входной код:

интервал   с   =   10  ;  для   (  int   я знак   равно   0  ;   я   <   10  ;   я  ++  )   {      c   знак равно   c   +   5  ;   // c увеличивается на 5 для каждой итерации цикла  } 

Выходной код

интервал   с   =   10  ;  для   (  int   я знак   равно   0  ;   я   <   10  ;   я  ++  )   {      c   знак равно   10   +   5   *   (  я   +   1  );    // c явно выражается как функция индекса цикла  } 

Нелинейные индукционные переменные

[ редактировать ]

Те же самые оптимизации можно применить к переменным индукции, которые не обязательно являются линейными функциями счетчика циклов; например, цикл

j   =   1  ;  для   (  я   знак равно   0  ;   я   <   10  ;   ++  я  )   {      j   знак равно   j   <<   1  ;  } 

может быть преобразован в

для   (  я знак   равно   0  ;   я   <   10  ;   ++  я  )   {      j   знак равно   1   <<   (  я  +  1  );  } 

См. также

[ редактировать ]
  1. ^ Стивен Мучник; Мучник и партнеры (15 августа 1997 г.). Расширенная реализация проекта компилятора . Морган Кауфманн. ISBN  978-1-55860-320-2 . индукционная переменная.

Дальнейшее чтение

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 6443f13c538110ebd835584e09e15ff0__1691845920
URL1:https://arc.ask3.ru/arc/aa/64/f0/6443f13c538110ebd835584e09e15ff0.html
Заголовок, (Title) документа по адресу, URL1:
Induction variable - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)