0

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

В общем, все вычисления времени компиляции обрабатываются посредством рекурсии, а не итерации. Насколько я знаю, функции constexpr, ожидаемые для вычисления во время компиляции, также должны быть рекурсивными. Что делает итерацию запрещенной для всего, что компилируется?

+0

Рекурсия - это форма итерации. – rici

+0

Вы также можете использовать 'std :: integer_sequence' –

+0

. Регулярная итерация теперь разрешена в C++ 14 для функции' constexpr'. Проблема состоит в том, чтобы проверить, что функция 'constexpr'. Это проще с рекурсией и без итераций. – Jarod42

ответ

1

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

С другой стороны, если вы пытаетесь запустить цикл, вам нужен не только код, который не просто выполняет операции с константами во время выполнения, но и является полноправным интерпретатором вашего языка. Вы должны иметь возможность объявлять переменные, устанавливать и получать их значения (как счетчики циклов), и еще хуже, вам нужно обнаружить бесконечные циклы, чтобы ваш компилятор не зависал (я имею в виду, while(true); - это абсолютно постоянное выражение).

Таким образом, из-за природы парсеров, АСТ и оптимизаторов, просто проще рекурсивно оценивать детали во время компиляции, чем реализовать полный поток управления и реализовать циклы и переменную манипуляцию.

Смежные вопросы