В качестве эксперимента я просто собрал некоторый код для генерации std::array<uint32_t, 256>
во время компиляции. Содержимое таблицы является довольно типичной таблицей поиска CRC. Единственное, что нового — это использование constexpr
функции для вычисления записей, а не для помещения автоматически сгенерированной магической таблицы непосредственно в исходный код.
В любом случае, это упражнение вызвало у меня любопытство: будут ли какие-то практические ограничения на объем вычислений, которые компилятор захочет сделать для оценки constexpr
определение функции или переменной во время компиляции? например что-то вроде GCC -ftemplate-depth
Параметр создания практических ограничений на количество шаблонов метапрограммирования оценки. (Мне также интересно, могут ли быть практические ограничения на длину пакета параметров — что ограничит размер времени компиляции std::array
создан с использованием std::integer_sequence
промежуточный объект.)
Рекомендации для таких можно найти в [implimits] №2:
(2.35) — рекурсивные вызовы функции constexpr [512]
(2.36) — Полные выражения оцениваются внутри основного константного выражения [1 048 576]
GCC и Clang позволяют регулировать через -fconstexpr-depth
(это флаг, который вы искали).
Оценка постоянных выражений практически выполняется в песочнице, потому что неопределенное поведение должно быть прервано реализацией. Имея это в виду, я не понимаю, почему реализация не может использовать все ресурсы хост-машины. Опять же, я бы не рекомендовал писать программы, для компиляции которых требуется гигабайт памяти или другие необоснованные ресурсы …
Других решений пока нет …