Программистам на C++ хорошо (надеюсь!) известно, что во время компиляции можно производить разнообразные вычисления. Лишь бы эти вычисления были "чистыми", без побочных эффектов. Это делается на шаблонах и на constexpr функциях.
Чистое выражение означает, что, сколько бы раз мы его ни попытались вычислить, мы получим один и тот же результат. Поэтому из соображений эффективности результат желательно мемоизировать, чтобы второй раз не делать ту же работу. Но насколько хорошо это умеет делать компилятор?
Для стресс-тестирования возьмём наивную формулу чисел Фибоначчи:
f(n) = (n < 2) ? 1 : f(n-1) + f(n-2)
Она интересна нам по нескольким причинам:
-
глубина рекурсии линейно зависит от n
-
без мемоизации она сводится к суммированию f(n) единичек, а это, напомню, экспонента по основанию золотого сечения
-
с мемоизацией — к запоминанию n значений
Как вычислить эту формулу в compile time? |