Арианский спор
- 1 year ago
- 0
- 0
Свёртка констант ( англ. constant folding ) и распространение констант (так же продвижение констант , дублирование констант , англ. constant propagation ) — часто используемые в современных компиляторах оптимизации , уменьшающие избыточные вычисления, путём замены константных выражений и переменных на их значения . Так же часто применяется расширенный алгоритм , выполняющий одновременно распространение констант и удаление некоторого мёртвого кода .
Свёртка констант — оптимизация, вычисляющая константные выражения на этапе компиляции. Прежде всего, упрощаются константные выражения, содержащие числовые литералы . Также могут быть упрощены выражения, содержащие никогда не изменяемые переменные или переменные, объявленные как константы . Рассмотрим пример:
i = 320 * 200 * 32;
Компилятор, поддерживающий свёртку констант, не будет генерировать две инструкции умножения и запись полученного результата. Вместо этого он распознает эту конструкцию как константное выражение и заменит её на вычисленное значение (в данном случае 2 048 000).
Распространение констант — оптимизация , заменяющее выражение, которое при выполнении всегда возвращает одну и ту же константу, самой этой константой . Это может быть константа, определённая ранее, или , применённая к константам. Рассмотрим следующий пример:
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;