Ho provato espressioni const che vengono valutate in fase di compilazione. Ma ho giocato con un esempio che sembra incredibilmente veloce quando eseguito in fase di compilazione.
#include<iostream>
constexpr long int fib(int n) {
return (n <= 1)? n : fib(n-1) + fib(n-2);
}
int main () {
long int res = fib(45);
std::cout << res;
return 0;
}
Quando eseguo questo codice sono necessari circa 7 secondi per l'esecuzione. Fin qui tutto bene. Ma quando cambio long int res = fib(45)
a const long int res = fib(45)
non ci vuole nemmeno un secondo. Per quanto ne so, viene valutato in fase di compilazione.
Ma la compilazione dura circa 0,3 secondi
In che modo il compilatore può valutarlo così rapidamente, ma in fase di esecuzione richiede molto più tempo? Sto usando gcc 5.4.0.
fib
. L'implementazione dei numeri di fibonacci che hai sopra è abbastanza lenta. Prova a memorizzare nella cache i valori delle funzioni nel codice di runtime e sarà molto più veloce.