restrict是c99引入的,它只可以用於限定指針,並表明指針是訪問一個數據對象的唯一且初始的方式.
僅當第二個指針基於第一個時,才能對對象進行存取.
例子
考慮下面的例子:
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進行了改變。使用了關鍵字restric,編譯器就可以放心地進行優化了。
void *memcpy(void * restrict s1,const void * restrict s2,size_t n);
如果拷貝發生在兩個重疊的對象之間,行為是不確定的。
void *memmove(void *s1, constvoid *s2, size_t n);
即使兩個指針指向的區域互相重疊,拷貝也不會受影響。
值得注意的是,一旦你決定使用restrict來修飾指針,你必須得保證它們之間不會互相重疊,編譯器不會替你檢查。