2014-10-27 51 views
3

我一直在使用C++,但從未真正深入細節。最近發現約constexpr,我認爲它具有微優化的巨大潛力,儘管我很難看到如何正確使用它。考慮到以下幾點:constexpr的使用案例與定義

#define squared(n) (n * n) 

constexpr int squared(int n) { 
    return n * n; 
} 

他們都輸出同樣的事情,但我敢肯定,他們有很大的不同。根據我的知識,定義指令在編譯時被替換,因此squared(n)的任何實例都只是(n * n)

顯然這是一個簡單的例子,但我想知道constexpr在哪裏發揮作用?它是否意味着用於比簡單文本替換更復雜的操作?使用它的主要優點是什麼?它與正常表達式有什麼不同?

+2

'squared(i ++)'... – 2014-10-27 08:43:54

+2

或'squared(1 + 1)'...... – Henrik 2014-10-27 08:49:40

+0

@Henrik好的,但是可以通過在內部使用'(n)'來獲得幫助,所有「理智的宏「(就像那個表達所表達的那樣是矛盾的)。 – Angew 2014-10-27 08:52:54

回答

5

他們根本不輸出相同的東西。考慮這個電話:

squared(x++); 

或者這個類:

struct Number 
{ 
    float value() const; 
    float squared() const; 
    // ... other members 
}; 

如果squared是一個函數宏這兩就會失敗。

因此,一如既往:不要使用語言的另一個功能也可以工作的宏。你可以說constexpr只允許我們在更少的地方使用宏 - 這是一件好事。

還有一個,非常重要的區別:constexpr功能可以(並且確實經常是)遞歸。函數式的宏不能。

+0

謝謝你清理它。 – 2014-10-28 09:08:09