當我們有恆定的數據時,例如形式指向const的指針是否與__restrict具有相同的效果?
double const * const
或double const *
這是否給編譯器的信息相同__restrict
/它有同樣的效果呢?
據我所知,__restrict
基本上承諾,指出的數據不會被/通過另一個指針更改。所以,一個指向const值的指針會有相同的承諾,不是嗎?
__restrict
這裏指的是Visual Studio中的關鍵字。我猜GCC中的含義是相似的。
當我們有恆定的數據時,例如形式指向const的指針是否與__restrict具有相同的效果?
double const * const
或double const *
這是否給編譯器的信息相同__restrict
/它有同樣的效果呢?
據我所知,__restrict
基本上承諾,指出的數據不會被/通過另一個指針更改。所以,一個指向const值的指針會有相同的承諾,不是嗎?
__restrict
這裏指的是Visual Studio中的關鍵字。我猜GCC中的含義是相似的。
不,__restrict
表示所討論的指針是當前作用域中指向該特定數據段的唯一指針,即該指針不是別名。這與const
不一樣,但我猜想它對於可修改的數據更有趣。
當與const的其他限制指針結合使用時,'const'的指針仍然很有趣,例如,在'memcpy()'中。 –
指向const
的指針不會告訴編譯器任何內容,它會爲某些隱式轉換請求警告。只有當對象本身被聲明爲const
時,編譯器可能會認爲它保持不變(即使const
被丟棄)。
__restrict
,另一方面,是對編譯器的承諾,即被引用的對象不會被當前作用域中的另一個指針混淆。
我找不到GCC文檔中__restrict
,但gcc -std=c99 -pedantic
接受int *__restrict foo;
和int *restrict foo;
兼容的聲明,表明它們具有相同的語義;暗示它與MSVC's __restrict
不一樣。
對於C99 restrict
(但不是MSVC __restrict
),因爲我讀的標準,一個restrict
-qualified指針const
-qualified類型不保證被引用的對象不改變(如果指針用於訪問對象) ,參見C11(n1570)6.7.3.1 p4。
'__restrict',以兩個下劃線開頭,通過傳統依賴於架構,並且必須小心使用。作爲程序員使用它是令人沮喪的,因爲它具有該前綴以表明它已用於實現某種編譯器/語言/實現功能,並且不能被客戶端軟件使用。另一方面,'const'是一種標準的語言功能,它允許編譯器檢測嘗試更改常量的值並警告用戶濫用值。 –