程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 指針是訪問一個數據對象的唯一且初始的方式

指針是訪問一個數據對象的唯一且初始的方式

編輯:C++入門知識

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關鍵字是強制性的

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved