Como o tempo de compilação pode ser (exponencialmente) mais rápido que o tempo de execução?

O código abaixo calcula os números de Fibonacci por umexponencialmente lento algoritmo:

#include <cstdlib>
#include <iostream>

#define DEBUG(var) { std::cout << #var << ": " << (var) << std::endl; }

constexpr auto fib(const size_t n) -> long long
{
    return n < 2 ? 1: fib(n - 1) + fib(n - 2);
}

int main(int argc, char *argv[])
{
    const long long fib91 = fib(91);

    DEBUG( fib91 );
    DEBUG( fib(45) );

    return EXIT_SUCCESS;
}

E estou calculando o 45º número de Fibonacci em tempo de execução e o 91º em tempo de compilação.

O fato interessante é que o GCC 4.9 compila o código e calculafib91 em uma fração de segundo, mas leva um tempo para cuspirfib(45).

Minha pergunta: se o GCC é inteligente o suficiente para otimizarfib(91) computação e não seguir o caminho exponencialmente lento, o que o impede de fazer o mesmo porfib(45)?

O GCC acima significa que produz duas versões compiladas dofib função onde um é rápido e o outro exponencialmente lento?

A questão énão como o compilador otimizafib(91) cálculo (sim! Ele usa uma espécie de memorização), mas se souber otimizar ofib função, por que não faz o mesmo parafib(45)? E, existem duas compilações separadas dofib função? Um lento e o outro rápido?

questionAnswers(3)

yourAnswerToTheQuestion