Próbowałem wyrażeń stałych, które są oceniane podczas kompilacji. Ale bawiłem się przykładem, który wydaje się niewiarygodnie szybki, gdy jest wykonywany w czasie kompilacji.
#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;
}
Po uruchomieniu tego kodu uruchomienie zajmuje około 7 sekund. Na razie w porządku. Ale kiedy przejdę long int res = fib(45)
na const long int res = fib(45)
to, nie zajmie to ani sekundy. W moim rozumieniu jest to oceniane w czasie kompilacji.
Ale kompilacja zajmuje około 0,3 sekundy
Jak kompilator może to ocenić tak szybko, ale w czasie wykonywania zajmuje to dużo więcej czasu? Używam gcc 5.4.0.
fib
. Wdrożenie powyższych liczb Fibonacciego jest bardzo powolne. Spróbuj buforować wartości funkcji w kodzie wykonawczym, a będzie to znacznie szybsze.