我試圖事情constexpr
:爲什麼鏗鏘不會用斐波那契的constexpr版本計算斐波納契(500)?
#include <iostream>
constexpr long long fibonacci(const int x)
{
return x <= 1 ? 1 : fibonacci(x - 1) + fibonacci(x - 2);
}
int main()
{
const long long lol = fibonacci(500);
std::cout << lol << std::endl;
}
所以我想lol
在編譯時進行計算:
[email protected]
» g++ -std=c++14 -g src/test.cc -o test.out
[email protected]
» ./test.out
4859788740867454402
它的工作真的很好用g++
。在編譯時,它甚至會做一些記憶,優化這個蹩腳的fibonnaci函數,然後立即計算fibonacci(500)
。
然後我試着用clang++
:
[email protected]
» clang++ -std=c++1y -g src/test.cc -o test.out
[email protected]
» ./test.out
... very long
lol
不受clang++
(由gdb
證明),在編譯時計算。 爲什麼?
此外,克++正在計算的東西,但不是第500 Fibonacci數。它很快溢出。即使30日也不會長久。 – 2014-12-05 16:20:33
根據[here](http://clang.llvm.org/docs/UsersManual.html#cmdoption-fconstexpr-depth),constexpr遞歸調用的默認深度是512.所以我猜這裏沒有問題它。正如@Cornstalks – streppel 2014-12-05 16:20:35
所提到的那樣,我認爲機會是一個整數溢出。此外,clang/gcc可能會檢測到一些溢出,並且由於有符號整數溢出是未定義的行爲,它們可能會產生不同的結果。 (考慮到第500個Fibonacci數爲[139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125](http://www.wolframalpha.com/input/?i=fibonacci+number+500)) – Cornstalks 2014-12-05 16:22:01