2013-11-01 40 views
2

我有以下結構:`restrict`關鍵字隱含的嚴格別名的級別是什麼?

typedef struct{ 
    int data[LENGTH]; 
}Data; 

,並使用它,像這樣:

Data* dt=CALLOC(...) 

int foo(Data* restrict d){ 
    for(...) 
     d[i]->data[j]; 
    //do stuff with data[] 
} 

我的問題是:是否從d去除嚴格別名也影響其成員或做我需要使用restrict上他們分開?換句話說,restrict暗示全部是包含在一個struct中的指針是否得到相同的處理?

編輯:通過水平混疊的我的意思是,如果一個指針到一個結構得到restrict版,將其中包含的任何其它指針被限制,以及(如與我的例子的情況下)。

+4

'restrict'並不完全是嚴格的別名。 – 2013-11-01 16:44:27

+0

看來我誤解了。什麼是「限制」的目的? – rath

+0

'restrict'本質上是程序員的一個承諾,即指針是唯一一個通過它訪問存儲的指針。 – gsg

回答

4

restrict僅適用於註釋指針本身(或由其生成的指針,比如通過指針算術),而不是通過該指針檢索到的任何值。

我不確定什麼'嚴格的別名水平'應該是什麼意思,但restrict是一個比嚴格別名更有力的承諾。嚴格別名允許指向兼容類型的別名:restrict是一個承諾,根本沒有別名。

+0

「restrict」的關鍵本質是編譯器有權假定,如果一個函數接收到一個「限制」限定指針,並且它可以看到指針副本或其他任何副本所做的所有事情,可以將對該指針所標識的事物的所有訪問視爲相對於系統中的其他任何事物而言是無序的,即使存在不透明函數或訪問未知出處的指針*。 – supercat