2012-12-02 69 views
6

一個在C++ 11某種方式gcc可以標記功能(不是一個類的方法)作爲const告訴它是,並且不使用全局內存,但只有它的參數?純函數C++ 11

我試過gcc__attribute__((const))而且它是恰恰是我想要的。但是當全局內存在函數中被觸及時,它不會產生任何編譯時錯誤。

編輯1

請注意。我的意思是純功能。 非常量函數。 GCC的屬性有點混亂。純函數只使用它們的參數。

+0

也不知道你的意思,但你試過'constexpr' –

+0

這不是。我的意思是純粹不恆定。海灣合作委員會的屬性有點混亂地命名。 – Cartesius00

+1

我認爲你需要改變你的問題,因爲你有正確的屬性。它不會產生你想要的警告是一個不同的問題 - 至少當你的問題是面值時。 –

回答

4

你是在找constexpr?這告訴編譯器該函數可以在編譯時進行評估。一個constexpr函數必須具有文字返回和參數類型,並且主體只能使用聲明和指令以及一個返回語句包含靜態聲明,typedefs。可以在常量表達式中調用一個constexpr函數。

constexpr int add(int a, int b) { return a + b; } 

int x[add(3, 6)]; 

說完看着的__atribute__((const))含義,答案是否定的,你不能用標準C做++。使用constexpr將達到相同的效果,但僅限於功能更爲有限的一組功能。然而,只要編譯後的程序的行爲方式相同(as-if規則),編譯器自身就無法停止這些優化。

+0

不,不,不是,我的意思是純粹的功能。請看我編輯。 – Cartesius00

+0

@Martin新增更多 –

+0

謝謝。屬性'constexpr'幾乎是無用的。也許讓我們再等一等。也許一些其他'gcc'特定的屬性可以幫助。 – Cartesius00

0

僅使用標準的C++ 11:

namespace g{ int x; } 

constexpr int foo() 
{ 
    //return g::x = 42; Nah, not constant 
    return 42;  // OK 
} 

int main() 
{} 

這裏的另一個例子:

constexpr int foo(int blah = 0) 
{ 
    return blah + 42;  // OK 
} 

int main(int argc, char**) 
{ 
    int bah[foo(2)];   // Very constant. 
    int const troll = foo(argc); // Very non-constant. 
} 

GCC的__attribute__(const)的含義在GNU compiler docs如&hellip被記錄;

許多函數不檢查除參數外的任何值,並且除返回值外沒有任何影響。基本上這比下面的pure屬性稍微嚴格一些,因爲函數不允許讀取全局內存。

人們可能會認爲函數的結果應該只取決於參數,並且函數應該沒有副作用。

這允許更一般類別的比C++ 11 constexpr,這使得功能inline功能,限制參數和函數結果字面類型,並限制功能體的「活性」語句到一個return語句,其中(C++ 11§7.1.5/ 3)

- 每一個構造呼叫和在初始化所述返回值(6.6.3,8.5)中使用的隱式轉換應是允許的之一常量表達式(5.19)

作爲一個例子,它很難(我認爲不是不可能,但很難)做出一個功能constexprsin函數。

但結果事項的純度只有兩方:

  • 當知道是純粹的,編譯器可以使用的Elid已知結果的電話。
    這主要是宏生成代碼的優化。使用inline函數替換宏以避免愚蠢地生成相同的子表達式。

  • 當已知是純粹的,程序員可以完全刪除一個調用。
    這只是適當的文檔的問題。 :-)

因此,不是尋找一種方法來表達例如sin在語言中,我建議只是通過宏避免代碼生成,並像這樣編寫純函數。

並使用constexpr作爲實際可行的功能(不幸的是,截至2012年12月,最新的Visual C++編譯器尚不支持constexpr)。


以前有一個關於the relationship between pure and constexpr的問題。主要是,每個constexpr功能是,但反之亦然。

+0

不,不是,我的意思是純函數,而不是常量函數。 – Cartesius00

+0

@Martin:好吧,到目前爲止,由於你的問題描述足夠模糊導致兩個這樣的答案,所以對於回答問題有點粗魯。 「有點」粗魯?對不起,我的意思是,*相當*粗魯。天啊。 –

+0

我的問題?這個問題是針對那些瞭解「pure」和GCC屬性的人。 – Cartesius00