Свёртка констант

Материал из Википедии — свободной энциклопедии
(перенаправлено с «Распространение констант»)
Перейти к навигации Перейти к поиску

Свёртка констант (англ. constant folding) и распространение констант (так же продвижение констант, дублирование констант, англ. constant propagation) — часто используемые в современных компиляторах оптимизации, уменьшающие избыточные вычисления, путём замены константных выражений и переменных на их значения[1]. Так же часто применяется расширенный алгоритм sparse conditional constant propagation[en], выполняющий одновременно распространение констант и удаление некоторого мёртвого кода[2].

Свёртка констант[править | править код]

Свёртка констант — оптимизация, вычисляющая константные выражения на этапе компиляции. Прежде всего, упрощаются константные выражения, содержащие числовые литералы. Также могут быть упрощены выражения, содержащие никогда не изменяемые переменные или переменные, объявленные как константы. Рассмотрим пример:

  i = 320 * 200 * 32;

Компилятор, поддерживающий свёртку констант, не будет генерировать две инструкции умножения и запись полученного результата. Вместо этого он распознает эту конструкцию как константное выражение и заменит её на вычисленное значение (в данном случае 2 048 000).

Распространение констант[править | править код]

Распространение констант — оптимизация, заменяющее выражение, которое при выполнении всегда возвращает одну и ту же константу, самой этой константой[3]. Это может быть константа, определённая ранее, или встроенная функция[en], применённая к константам. Рассмотрим следующий пример:

  int x = 14;
  int y = 7 - x / 2;
  return y * (28 / x + 2);

Распространение x возвращает:

  int x = 14;
  int y = 7 - 14 / 2;
  return y * (28 / 14 + 2);

Далее, свёртка констант и распространение y возвращают следующее (присваивания x и y, вероятно, в дальнейшем будут удалены оптимизацией удаления мёртвого кода):

  int x = 14;
  int y = 0;
  return 0;

См. также[править | править код]

Примечания[править | править код]

  1. Практикум «Оптимизирующие компиляторы» (на примере GCC). — НГУ им. Лобачевского. — С. 100.
  2. Muchnick, 1997, p. 362-370.
  3. Dragon Book, 2008, p. 760.

Литература[править | править код]

  • Steven S. Muchnick. Advanced Compiler Design and Implementation. — 5-е издание. — San Francisco: Morgan Kaufmann Publishers, 1997. — 856 с. — ISBN 1-55860-320-4.
  • Альфред Ахо, Моника Лам, Рави Сети, Джеффри Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е издание. — М.: «Вильямс», 2008. — 1184 с. — 1500 экз. — ISBN 978-5-8459-1349-4.

Ссылки[править | править код]