2017-04-01 65 views
2

免責聲明:這個問題有點複雜,因爲它是一個問題,但它們都涉及到同一種概念/問題。C++編譯器可以緩存constexpr函數的結果嗎?

前提: consexpr功能可能僅由單個return聲明。

它們可以調用其他函數和使用條件,但理論上它們應該展示功能的純度,因此結果應該在某種映射中可以緩存(由編譯器在編譯時),這樣編譯器就沒有不斷重新評估相同的功能。

問題(S): 這是假設是正確的或者是有什麼我還沒有考慮,使得它不可能緩存constexpr函數的結果? 如果不是,這是否意味着每次使用函數時都必須計算constexpr函數?

template怎麼樣? template可以緩存的值是constexpr還是每次都必須重新計算?

+0

通常可以在編譯時評估'consexpr'函數;這是練習的重點。在那種情況下,可執行代碼最終只是通過評估函數調用的結果,而不是函數本身的代碼。這是最終的緩存。或者你問編譯器是否可以在編譯時優化多個評估?可能,但我不知道你爲什麼在意。 –

+0

你爲什麼要在意?它對你的程序有什麼不同? –

+0

@IgorTandetnik我的意思是編譯器假定函數是純粹的,使用映射緩存給定輸入的結果,並從此開始查閱緩存(即映射),而不是不斷重新評估函數? – Pharap

回答

1

我不相信constexpr功能必須是純粹的 - 至少,不是所有可能的論點。考慮:

#include <iostream> 
#include <stdlib.h> 

constexpr int f(int n) { return n == 0 ? 42 : rand(); } 

template <int n> void g() {} 

int main() 
{ 
    g<f(0)>(); // OK 
// g<f(1)>(); // error 
    std::cout << f(0) << ' ' << f(1) << ' ' << f(2); 
} 

輸出:42 1804289383 846930886Demo

+0

這是一些非常奇怪的行爲。我很確定'rand'不是'constexpr',所以我覺得'constexpr'函數可以接受它是有效的。 – Pharap

+1

@Pharap絕對不要求constexpr函數只包含對其他constexpr函數的調用。 –

相關問題