簡體   English   中英

constexpr函數在編譯時不計算值

[英]constexpr function not calculate value in compile time

我想比較元編程和c ++ 0x中constexpr的使用。 然后我在兩個模型中寫了一個fib函數。 當我使用元編程模型時,答案打印速度非常快,因為它是在編譯時計算的。 但是當我使用constexpr函數時,它會在運行時計算值,而不是在編譯時。 我使用g ++(gcc)4.8。可以幫助我嗎?

#include <iostream>
using namespace std;
#define NUM 42

template <unsigned int N>
struct Fibonacci {
    enum { value = Fibonacci<N - 1>::value + Fibonacci<N - 2>::value };
};

template <>
struct Fibonacci<1> {
    enum { value = 1 };
};

template <>
struct Fibonacci<0> {
    enum { value = 1 };
};

constexpr unsigned int fib(unsigned int n)
{
    return (n > 1 ? fib(n-1) + fib(n-2) : 1 );
}

int main()
{

    cout << "Meta_fib(NUM)      : " << Fibonacci<NUM>::value << endl; // compile time :)
    cout << "Constexpr_fib(NUM) : " << fib(NUM) << endl;        // run time :-?
    return 0;
}

我相信原因是constexpr不能保證在編譯時執行。 要強制執行編譯時評估,必須將其分配給編譯時別名。 喜歡,

enum {i = fib(NUM)};

至少使用gcc,你可以通過使它成為靜態變量來獲得在編譯時計算的constexpr值:

static const unsigned fibNUM = fib(NUM);

當我閱讀標准時,它仍然允許在啟動時計算值,但實際上它將在編譯時計算。

一個簡單的測試,看看你的constexpr是否真的在編譯時完成是使用std::array

#include <array>

std::array<int, Fibonacci<5>::value> arr;
std::array<int, fib(5)> arr2;

gcc沒有抱怨

請參閱Bjarne Stroustrup的評論

...根據標准,constexpr函數可以在編譯器時或運行時計算,除非它被用作常量表達式,在這種情況下,它必須在編譯時進行評估。 為了保證編譯時評估,我們必須在需要常量表達式的地方使用它(例如,作為數組綁定或作為case標簽)或使用它來初始化constexpr。 我希望沒有自尊的編譯器會錯過我最初所說的優化機會:“如果constexpr函數的所有參數都是常量表達式,那么它將在編譯時進行評估。”

constexpr不保證在編譯時進行評估。 這意味着,編譯器可以選擇是在編譯時還是在運行時進行求值。 您可以嘗試將其分配給編譯時常量並像這樣檢查...

const long i = fib(NUM);// here i should be initialized at the time of 
                        // declaration
cout << "Meta_fib(NUM)      : " << Fibonacci<NUM>::value << endl; 
cout << "Constexpr_fib(NUM) : " << i << endl;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM