2017-06-21 41 views
5

我想弄清楚是否有性能增益與constexpr而不是通常創建對象。Constexpr創建對象

這是constexpr的代碼片段。

class Rect 
{ 
    const int a; 
    const float b; 
public: 
    constexpr Rect(const int a,const float b) 
    : a(a),b(b){} 
}; 

int main() 
{ 
    constexpr Rect rect = Rect(1,2.0f); 
} 

並且沒有constexpr

class Rect 
{ 
    int a; 
    float b; 
public: 
    Rect(int a, float b) 
    : a(a),b(b){} 
}; 

int main() 
{ 
    Rect rect = Rect(1,2.0f); 
} 

我期待會有少了很多代碼爲constexpr,因爲內存應該在編譯時被初始化。

我正在使用constexpr嗎?如果這不是真的,你可以使用constexpr在編譯時創建對象,然後使用它們而沒有任何運行時開銷?

謝謝!

+5

_「的constexpr指定符,它是__possible__評估在編譯時函數或變量的值」 _來源:http://en.cppreference.com/w/cpp/language/constexpr。並不是說它需要在編譯時進行評估。嘗試更改'Rect rect = Rect(1,2.0f);'爲'constexpr Rect rect {1,2.0f};' –

+0

爲什麼downvote?這是寫得很好,*不*明顯(至少,不是我)。 – Bathsheba

+4

我的意思是,當你開啓優化時沒有什麼區別,因爲你不用'rect'做任何事情,所以[它會被刪除](https://godbolt.org/g/hQxTnU)是否或不是你用'constexpr'。你無法比沒有代碼更有效率! – cdhowie

回答

0

事實證明,我有一些包含的代碼相似性的頭文件。

答案是這兩種情況之間有很大的區別。

當沒有優化編譯,there is a substantial difference在生成的代碼... -cdhowie