Я упоминал об этом, и это представляет интересную и хитрую проблему оптимизации. В этих случаях используются два совершенно разных пути кода, поскольку один ДОЛЖЕН быть оценен во время компиляции, а другой - нет.

ользую gcc 4.6.1 и получаю интересное поведение, связанное с вызовомconstexpr функция. Эта программа работает очень хорошо и сразу распечатывает12200160415121876738.

#include <iostream>

extern const unsigned long joe;

constexpr unsigned long fib(unsigned long int x)
{
   return (x <= 1) ? 1 : (fib(x - 1) + fib(x - 2));
}

const unsigned long joe = fib(92);

int main()
{
   ::std::cout << "Here I am!\n";
   ::std::cout << joe << '\n';
   return 0;
}

Эта программа работает вечно, и у меня никогда не было терпения ждать, пока она напечатает значение:

#include <iostream>

constexpr unsigned long fib(unsigned long int x)
{
   return (x <= 1) ? 1 : (fib(x - 1) + fib(x - 2));
}

int main()
{
   ::std::cout << "Here I am!\n";
   ::std::cout << fib(92) << '\n';
   return 0;
}

Почему такая огромная разница? Я что-то не так делаю во второй программе?

Редактировать: Я собираю это сg++ -std=c++0x -O3 на 64-битной платформе.

Ответы на вопрос(4)

Ваш ответ на вопрос