restrict,C語言中的一種類型限定符(Type Qualifiers),用於告訴編譯器,對象已經被指針所引用,不能通過除該指針外所有其他直接或間接的方式修改該對象的內容。
基本介紹
簡介,例子,例子,英文單詞,語法讀音,詞典解釋,
簡介
restrict是c99標準引入的,它只可以用於限定和約束指針,並表明指針是訪問一個數據對象的唯一且初始的方式.即它告訴編譯器,所有修改該指針所指向記憶體中內容的操作都必須通過該指針來修改,而不能通過其它途徑(其它變數或指針)來修改;這樣做的好處是,能幫助編譯器進行更好的最佳化代碼,生成更有效率的彙編代碼.如 int *restrict ptr, ptr 指向的記憶體單元只能被 ptr 訪問到,任何同樣指向這個記憶體單元的其他指針都是未定義的,直白點就是無效指針。restrict 的出現是因為 C 語言本身固有的缺陷,C 程式設計師應當主動地規避這個缺陷,而編譯器也會很配合地最佳化你的代碼.
例子
考慮下面的例子:
int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;
這裡說明restar是訪問由malloc()分配的記憶體的唯一且初始的方式。par就不是了。
那么:
for(n=0;n<10;n++)
{
par[n]+=5;
restar[n]+=5;
ar[n]*=2;
par[n]+=3;
restar[n]+=3;
}
因為restar是訪問分配的記憶體的唯一且初始的方式,那么編譯器可以將上述對restar的操作進行最佳化:
restar[n]+=8;
而par並不是訪問數組ar的唯一方式,因此並不能進行下面的最佳化:
par[n]+=8;
因為在par[n]+=3前,ar[n]*=2進行了改變。使用了關鍵字restrict,編譯器就可以放心地進行最佳化了。
這個關鍵字據說來源於古老的FORTRAN。有興趣的看看這個。
例子
C庫中有兩個函式可以從一個位置把位元組複製到另一個位置。在C99標準下,它們的原型如下:
void * memcpy(void * restrict s1, const void * restrict s2, size_t n);
void * memmove(void * s1, const void * s2, size_t n);