歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

UNIX中的restrict

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來修飾指針,你必須得保證它們之間不會互相重疊,編譯器不會替你檢查。

Copyright © Linux教程網 All Rights Reserved