2014-03-31 134 views
0

請問使用constexpr而不是const更好的幫忙編譯優化?我有一些不變的價值。我可以使用enum代替,但它們並非全部屬於同一類型,我不想使用#define。他們聲明如下代碼。我的問題是:如果我使用constexpr它會增加編譯器替換文字常量值所使用的值的可能性,或者如果我使用const,它將不會有所不同?我知道這是由每個編譯器決定的,如果這樣做或者不是優化,而是一個「普遍」的答案,因爲它在大多數編譯器中的行爲是非常受歡迎的。另外,假設結果對於這樣的簡單當地人來說是不同的,如果它們不是struct/class的成員,那麼結果是不同的?在這種情況下,const是最難以執行的操作嗎?constexpr vs const:會用constexpr代替const更好的幫忙編譯優化?

e.g,

int foo() 
{ 
    constexpr int x = 10; 
    constexpr int y = x * 3; 
    do_domsething(y + n); 
} 

int foo() 
{ 
    const int x = 10; 
    const int y = x * 3; 
    do_domsething(y + n); 
} 

回答

3

今天,constexpr仍然是相當新的,可能屬於通過一些優化裂縫。當然,計算變量自身的值需要在編譯時進行。從長遠來看,我希望每個人都有相同的優化機會。很明顯,當發生這種情況是編譯器特定的。

只要使用哪一個對你和其他任何人在代碼上工作的人有更明確的含義,不僅在行爲方面而且在意圖方面。

除其他事項外,請注意constexpr保證恆定的值相同總是,而const允許它有不同的值達到每次初始化(不能除外初始化改變,當然) 。但幾乎地球上的每個編譯器都會確定,對於您的示例,這些值實際上是恆定的。

還有一件事:constexpr編譯時評估(如模板參數計算)即使在優化禁用時也處於活動狀態。

+0

您指的是哪種優化機會?我不認爲像這樣的東西存在(除了常量摺疊,這應該適用於'const'和'constexpr',因爲它總是在子表達式上工作,而且這些既不是'const'也不是'constexpr')。 'const'可以幫助你*寫出更高效,因爲你可以避免在某些地方複製。但它不允許編譯器執行優化。 –

+0

@KonradRudolph:例如,constness限制別名。 –

相關問題