2012-05-19 32 views
0

我想在編譯時創建一個常量。這就是我的意思是:C++:如何在編譯時創建一個常量?

template <int M = 31> 
int fast_hash(int prev_hash, int c1, int c3) 
{ 
    enum {m3 = m*m*m;} 
    return m * prev_hash - m3 * c1 + c3; 
} 

在上面的例子中,我可以計算M3 = M * m * m的每一次函數被調用,但我想,如果這樣做了一次,並且在這將是涼爽編譯時間。我怎樣才能做到這一點?

+2

我認爲m3在這種情況下將是一個常數。在不斷傳播之後,編譯器會將m3評估爲一個常量。 –

回答

4

這將最好C++ 11constexpr可以做到,但在C++ 03你仍然可以做它用元函數:

template< int M > 
struct some_calculation 
{ 
    static const int value = M * M * M; 
}; 

這當然冷卻器,但我認爲你太擔心這件事太早了。

+3

不成熟的優化畢竟是萬惡之源。 – chris

+2

除了對過早優化的評論之外,這並不能解決原始代碼中尚未解決的任何問題,而這會在C++中產生一個常量表達式,所以'enum {m3 = m * m * m};'(即只能在編譯時通過解析常量表達式來爲enums提供值) –

2

我想你是誤會你提供的代碼不會在C++:

template <int M = 31> 
int fast_hash(int prev_hash, int c1, int c3) 
{ 
    enum {m3 = m*m*m;} 
    return m * prev_hash - m3 * c1 + c3; 
} 

在原代碼,m3已經是一個編譯時間常數(常量表達式)。編譯器會計算它並用該值替換用途。請注意,您只能從常量表達式(在編譯時計算)設置枚舉數的值。

事實上,這是一個不成熟的優化。在大多數情況下,您甚至不需要定義枚舉,因爲編譯時間常數爲M(模板參數),所有編譯器將用適當的值替換M*M*M。這對於編譯器來說是微不足道的,並且沒有生產級別的編譯器會無法做到這一點。

相關問題