2015-01-08 43 views
0

當我們有恆定的數據時,例如形式指向const的指針是否與__restrict具有相同的效果?

  • double const * const
  • double const *

這是否給編譯器的信息相同__restrict /它有同樣的效果呢?

據我所知,__restrict基本上承諾,指出的數據不會被/通過另一個指針更改。所以,一個指向const值的指針會有相同的承諾,不是嗎?

__restrict這裏指的是Visual Studio中的關鍵字。我猜GCC中的含義是相似的。

+0

'__restrict',以兩個下劃線開頭,通過傳統依賴於架構,並且必須小心使用。作爲程序員使用它是令人沮喪的,因爲它具有該前綴以表明它已用於實現某種編譯器/語言/實現功能,並且不能被客戶端軟件使用。另一方面,'const'是一種標準的語言功能,它允許編譯器檢測嘗試更改常量的值並警告用戶濫用值。 –

回答

5

不,__restrict表示所討論的指針是當前作用域中指向該特定數據段的唯一指針,即該指針不是別名。這與const不一樣,但我猜想它對於可修改的數據更有趣。

+0

當與const的其他限制指針結合使用時,'const'的指針仍然很有趣,例如,在'memcpy()'中。 –

1

指向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。

相關問題