restrict是c99引入的,它只可以用於限定指針,並表明指針是訪問一個數據對象的唯一且初始的方式. 僅當第二個指針基於第一個時,才能對對象進行存取. 例子 考慮下面的例子: int ar[10]; int * restrict restar=(int *)malloc(10*sizeof(int)); int *par=ar; 這裡說明restar是訪問由malloc()分配的內存的唯一且初始的方式。par就不是了。 那麼: [cpp] 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來修飾指針,你必須得保證它們之間不會互相重疊,編譯器不會替你檢查。 void setbuf (FILE *restrict fp,char *restrict buf); 表示fp和buf所指內存空間不交叉 這個關鍵字與優化有關。 比方 www.2cto.com void func(int*a,int*b) { *a+=*b; *a+=*b; } 本來可以優化為 void func(int*a,int*b) { *a+=*b<<1; } 可是如果a和b指向同一整型,兩個函數語意就不一樣了。 因為有這種風險,於是很多編譯器便不會這麼優化了。 現在加了restrict關鍵字,編譯器就可以大膽的做這種優化了 另外,對於優化而言,restrict,register關鍵字是建議性的,而volatile關鍵字是強制性的