一個在C++ 11某種方式gcc
可以標記功能(不是一個類的方法)作爲const
告訴它是純,並且不使用全局內存,但只有它的參數?純函數C++ 11
我試過gcc
的__attribute__((const))
而且它是恰恰是我想要的。但是當全局內存在函數中被觸及時,它不會產生任何編譯時錯誤。
編輯1
請注意。我的意思是純功能。 非常量函數。 GCC的屬性有點混亂。純函數只使用它們的參數。
一個在C++ 11某種方式gcc
可以標記功能(不是一個類的方法)作爲const
告訴它是純,並且不使用全局內存,但只有它的參數?純函數C++ 11
我試過gcc
的__attribute__((const))
而且它是恰恰是我想要的。但是當全局內存在函數中被觸及時,它不會產生任何編譯時錯誤。
編輯1
請注意。我的意思是純功能。 非常量函數。 GCC的屬性有點混亂。純函數只使用它們的參數。
你是在找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規則),編譯器自身就無法停止這些優化。
不,不,不是,我的意思是純粹的功能。請看我編輯。 – Cartesius00
@Martin新增更多 –
謝謝。屬性'constexpr'幾乎是無用的。也許讓我們再等一等。也許一些其他'gcc'特定的屬性可以幫助。 – Cartesius00
僅使用標準的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)
作爲一個例子,它很難(我認爲不是不可能,但很難)做出一個功能constexpr
sin
函數。
但結果事項的純度只有兩方:
當知道是純粹的,編譯器可以使用的Elid已知結果的電話。
這主要是宏生成代碼的優化。使用inline
函數替換宏以避免愚蠢地生成相同的子表達式。
當已知是純粹的,程序員可以完全刪除一個調用。
這只是適當的文檔的問題。 :-)
因此,不是尋找一種方法來表達例如sin
在語言中,我建議只是通過宏避免代碼生成,並像這樣編寫純函數。
並使用constexpr
作爲實際可行的功能(不幸的是,截至2012年12月,最新的Visual C++編譯器尚不支持constexpr
)。
以前有一個關於the relationship between pure and constexpr
的問題。主要是,每個constexpr
功能是純,但反之亦然。
不,不是,我的意思是純函數,而不是常量函數。 – Cartesius00
@Martin:好吧,到目前爲止,由於你的問題描述足夠模糊導致兩個這樣的答案,所以對於回答問題有點粗魯。 「有點」粗魯?對不起,我的意思是,*相當*粗魯。天啊。 –
我的問題?這個問題是針對那些瞭解「pure」和GCC屬性的人。 – Cartesius00
也不知道你的意思,但你試過'constexpr' –
這不是。我的意思是純粹不恆定。海灣合作委員會的屬性有點混亂地命名。 – Cartesius00
我認爲你需要改變你的問題,因爲你有正確的屬性。它不會產生你想要的警告是一個不同的問題 - 至少當你的問題是面值時。 –