Практические ограничения на количество вычислений constexpr

В качестве эксперимента я просто собрал некоторый код для генерации std::array<uint32_t, 256> во время компиляции. Содержимое таблицы является довольно типичной таблицей поиска CRC. Единственное, что нового — это использование constexpr функции для вычисления записей, а не для помещения автоматически сгенерированной магической таблицы непосредственно в исходный код.

В любом случае, это упражнение вызвало у меня любопытство: будут ли какие-то практические ограничения на объем вычислений, которые компилятор захочет сделать для оценки constexpr определение функции или переменной во время компиляции? например что-то вроде GCC -ftemplate-depth Параметр создания практических ограничений на количество шаблонов метапрограммирования оценки. (Мне также интересно, могут ли быть практические ограничения на длину пакета параметров — что ограничит размер времени компиляции std::array создан с использованием std::integer_sequence промежуточный объект.)

5

Решение

Рекомендации для таких можно найти в [implimits] №2:

(2.35) — рекурсивные вызовы функции constexpr [512]

(2.36) — Полные выражения оцениваются внутри основного константного выражения [1 048 576]

GCC и Clang позволяют регулировать через -fconstexpr-depth (это флаг, который вы искали).

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]