C åèæå
- C è¯è¨
- C çåå²
- åºæ¬æ¦å¿µ
- 表达å¼
- 声æ
- åå§å
- 彿°
- è¯å¥
- éææè¨
- å符常é
- 彿°å£°æ
- 彿°å®ä¹
- 转ä¹åºå
- ç¿»è¯é¶æ®µ
- æ è¯ç¬¦
- ä½ç¨å
- çåæ
- æ¥æ¾ä¸å½å空é´
- ASCII ç 表
- ç±»å
- éµä»æ§
- ç®æ¯ç±»å
- restrict ç±»åéå®ç¬¦
- ç±»å
- 对象ä¸å¯¹é½
- 䏻彿°
- æªå®ä¹è¡ä¸º
- å 忍¡å
- if è¯å¥
- switch è¯å¥
- for 循ç¯
- while 循ç¯
- do-while 循ç¯
- continueè¯å¥
- break è¯å¥
- gotoè¯å¥
- return è¯å¥
- å¼ç±»å«
- æ±å¼é¡ºåº
- æ´æ°å¸¸é
- æµ®ç¹å¸¸é
- å符串åé¢é
- å¤ååé¢é
- 常é表达å¼
- éå¼è½¬æ¢
- æå访é®è¿ç®ç¬¦
- é»è¾è¿ç®ç¬¦
- æ¯è¾è¿ç®ç¬¦
- ç®æ¯è¿ç®ç¬¦
- èµå¼è¿ç®ç¬¦
- èªå¢/èªåè¿ç®ç¬¦
- å ¶ä»è¿ç®ç¬¦
- sizeof è¿ç®ç¬¦
- _Alignof è¿ç®ç¬¦
- 转åè¿ç®ç¬¦
- C è¿ç®ç¬¦ä¼å 级
- æ³åéæ©
- æ éåå§å
- æ°ç»åå§å
- ç»æä½ä¸èåä½åå§å
- æé声æ
- æ°ç»å£°æ
- æä¸¾
- åå¨ç±»æå®ç¬¦
- const ç±»åéå®ç¬¦
- volatile ç±»åéå®ç¬¦
- ç»æä½å£°æ
- èåä½å£°æ
- ä½å
- _Alignas
- typedef 声æ
- ååç±»å
- å¤é¨åè¯æ¢æ§å®ä¹
- inline 彿°æå®ç¬¦
- _Noreturn 彿°æå®ç¬¦
- åé¿åæ°
- å èæ±ç¼
- å¯åææ§
- æ¿ç¨è¿ç®ç¬¦åè®°å·
- C å ³é®è¯
- é¢å¤çå¨
- C æ ååºå¤´æä»¶
- ç±»åæ¯æ
- ç¨åºæ¯æå·¥å ·
- å忰彿°
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- ç®æ³
- æ°å¼
- æä»¶è¾å ¥/è¾åº
- æ¬å°åæ¯æ
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C æ ååº
- æç¨çèµæº
- 符å·ç´¢å¼
- 注é
ä½ç½®ï¼é¦é¡µ > C åèæå >C è¯è¨ > restrict ç±»åéå®ç¬¦
restrict ç±»åéå®ç¬¦
C ç±»åç³»ç»ä¸æ¯ä¸ä¸ªç¬ç«çç±»åå¨é½ææ°ä¸ªè¯¥ç±»åçéå®çæ¬ï¼å¯¹åº const ã volatile åéå®å¯¹äºæå对象æéç restrict éå®ç¬¦ä¸çä¸ä¸ªã两个æå ¨é¨ä¸ä¸ªãæ¤é¡µé¢æè¿° restrict éå®ç¬¦çææã
ä» ææå对象类åçæéè½æ restrict éå®ï¼å ·ä½èè¨ï¼ä»¥ä¸æ¯é误çï¼
- int restrict *p
- float (* restrict f9)(void)
restrict è¯ä¹ä» åºç¨äºå·¦å¼è¡¨è¾¾å¼ï¼ä¾å¦å° restrict é宿éçç±»å转æ¢ï¼æè¿å restrict é宿éç彿°è°ç¨ä¸æ¯å·¦å¼ï¼ä»è该éå®ç¬¦æ ææã
卿¯ä¸ªå£°æå£°æäº restrict æé P çåï¼å
¸åä¾åæ¯å½æ°ä½çæ§è¡ï¼å
¶ä¸ P ä¸ºåæ°ï¼ä¸ï¼è¥æä¸ªå¯¹è±¡å¯ç± P 访é®ï¼ç´æ¥æé´æ¥ï¼ç对象ä¼è¢«ä»»ä½ææ®µä¿®æ¹ï¼å该å䏿æå¯¹è¯¥å¯¹è±¡ï¼è¯»æåï¼ç访é®ï¼é½å¿
é¡»ç»ç± P åºç°ï¼å¦åè¡ä¸ºæªå®ä¹ï¼
void f(int n, int * restrict p, int * restrict q) { while(n-- > 0) *p++ = *q++; // éè¿ *p ä¿®æ¹ç对象ä¸éè¿ *q 读åçæ ä¸ç¸å // ç¼è¯å¨å¯ä»¥èªç±å°ä¼åãåéåãå页颿 å°ççã } void g(void) { extern int d[100]; f(50, d + 50, d); // OK f(50, d + 1, d); // æªå®ä¹è¡ä¸ºï¼ d[1] 被 f ä¸ç p å q ä¸åè®¿é® }
è¥å¯¹è±¡å³ä¸è¢«ä¿®æ¹ï¼åå®å¯ä»¥è¢«å«åå¼ç¨ï¼å¹¶è¢«å¼äº restrict éå®çæé访é®ï¼æ³¨æè¥å¯¹è±¡ä¸ºå«åå¼ç¨ç restrict é宿鿿ï¼åå«åå¼ç¨å¯è½æå¶ä¼åï¼ã
å°ä¸ä¸ª restrict æéèµå¼ç»å¦ä¸ä¸ªæ¯æªå®ä¹è¡ä¸ºï¼é¤éå°æåå¤é¨åçæéèµå¼ç»å é¨åä¸çæéï¼å æ¬å¨è°ç¨å« restrict æéåæ°ç彿°æ¶ï¼ä»¥ restrict æéä¸ºåæ°ï¼ï¼æä»å½æ°è¿åæéï¼è¿æå¨åä¸ä¸ªæéçåå·²ç»ç»ææ¶ï¼ï¼
int* restrict p1 = &a; int* restrict p2 = &b; p1 = p2; // æªå®ä¹è¡ä¸º
restrict æéå¯ä»¥èªç±å°èµå¼ç»é restrict æéï¼åªè¦ç¼è¯å¨è¿è½ä¼å代ç ï¼ä¼åæºä¼è¿æ¯ä¿çå°±ä½çï¼
void f(int n, float * restrict r, float * restrict s) { float * p = r, * q = s; // OK while(n-- > 0) *p++ = *q++; // å ä¹è¯å®ä¼åæä» å¦ *r++ = *s++ ä¸è¬ }
è¥æ°ç»ç±»å声æå ·æ restrict ç±»åéå®ç¬¦ï¼éè¿ä½¿ç¨ typedef ï¼ï¼åæ°ç»ç±»åæ¬èº«ä¸æ¯ restrict éå®ï¼ä½å ¶å ç´ ç±»åæ¯ restrict éå®ï¼
typedef int *array_t[10]; restrict array_t a; // a çç±»åæ¯ int *restrict[10] // 注æï¼å¯è½æäºè®®ï¼ Oracle Studio å GNU æ¥åï¼ä½ Clang å Intel å array_t 䏿¯æéç±»åèæç»
å¨å½æ°å£°æä¸ï¼å
³é®è¯ restrict å¯ä»¥åºç°äºæ¹æ¬å·å
ï¼ç¨ä»¥å£°æå½æ°åæ°çæ°ç»ç±»åãå®å¯¹æ°ç»æè½¬æ¢å¾çæéç±»åèµäºéå®ï¼
void f(int m, int n, float a[restrict m][n], float b[restrict m][n]); void g12(int n, float (*p)[n]) { f(10, n, p, p+10); // OK f(20, n, p, p+10); // å¯è½æ¯æªå®ä¹è¡ä¸ºï¼åå³äº f æä¸ºï¼ }
注解
restrict éå®ç¬¦ï¼åå¯åå¨åå¨ç±»ï¼æ¯ææä½¿ç¨ä»¥ä¿è¿ä¼åçãè仿æç»æä¸è´ç¨åºçé¢å¤çç¿»è¯åå ä¸ï¼å é¤æææ¤éå®ç¬¦çå®ä¾ä¸ä¼å½±åå ¶å«ä¹ï¼å³å¯è§çè¡ä¸ºï¼ã
ç¼è¯å¨å¯ä»¥å¿½ç¥ä»»ä½ä¸ä¸ªæå
¨é¨ä½¿ç¨ restrict çå«åä½¿ç¨æç¤ºã
欲é¿å æªå®ä¹è¡ä¸ºï¼ç¨åºååºè¯¥ç¡®ä¿ restrict é宿éæåçå«åå¼ç¨æè¨ä¸ä¼è¿è§ã
许å¤ç¼è¯å¨æä¾ä½ä¸º restrict 对ç«é¢çè¯è¨æ©å±ï¼æç¤ºå³ä½¿æéç±»åä¸åï¼ä¹å¯ä»¥å«å使ç¨ç屿§ï¼ may_alias (gcc)
ä½¿ç¨æ¨¡å¼
restrict é宿éæå ç§å¸¸ç¨çä½¿ç¨æ¨¡å¼ï¼
æä»¶ä½ç¨å
æä»¶ä½ç¨åç restrict é宿éå¿ é¡»å¨ç¨åºè¿è¡æé´æåå个æ°ç»çå ç´ ã该æ°ç»å¯¹è±¡ä¸å¯ä»¥éè¿ restrict æéåéè¿å ¶å£°æåç§°ï¼è¥æçè¯ï¼æå¦ä¸ä¸ª restrict æéä¸¤ç§æ¹å¼ä¸åå¼ç¨ã
æä»¶ä½ç¨å restrict æé对访é®å¨æåé çå ¨å±æ°ç»æç¨ï¼ restrict è¯ä¹ä»¤éè¿æ¤æéçå¼ç¨ï¼åéè¿éææ°ç»ç声æåç§°å¼ç¨è¯¥æ°ç»æçç¸å½ï¼
float * restrict a, * restrict b; float c[100];  int init(int n) { float * t = malloc(2*n*sizeof(float)); a = t; // a å¼ç¨åå b = t + n; // b å¼ç¨åå } // ç¼è¯å¨å¯ä»¥ä» restrict éå®ç¬¦æ¨æ a ã b å c 齿²¡ææ½å¨çå«åå¼ç¨
彿°åæ°
æå¹¿æ³ç restrict é宿é使ç¨ï¼æ¯ç¨ä½å½æ°åæ°ã
å¨ä¸ä¾ä¸ï¼ç¼è¯å¨å¯è½æ¨æåºè¢«ä¿®æ¹å¯¹è±¡ä¸ä¼æå«åå¼ç¨ï¼ä»èè½æ´å¤§èå°ä¼å循ç¯ãå¨ f çå
¥å£å¤ï¼å¿
é¡»æä¾ restrict æé对å
³èæ°ç»çç¬å 访é®ãç¹å«æ¯ï¼å¨ f å
b æ c é½ä¸å¯ä»¥æå
¥ a æå
³èçæ°ç»ï¼å 为å®ä»¬é½ä¸æ¯ä»¥åºäº a çæéå¼èµå¼çãå¯¹äº b ï¼å 为å
¶å£°æç const éå®ç¬¦è¿æ¯æ¾ç¶çï¼ä½å¯¹äº c ï¼éè¦æ£æ¥ f ç彿°ä½ï¼
float x[100]; float *c; void f(int n, float * restrict a, float * const b) { int i; for ( i=0; i<n; i++ ) a[i] = b[i] + c[i]; } void g3(void) { float d[100], e[100]; c = x; f(100, d, e); // OK f( 50, d, d+50); // OK f( 99, d+1, d); // æªå®ä¹è¡ä¸º c = d; f( 99, d+1, e); // æªå®ä¹è¡ä¸º f( 99, e, d+1); // OK }
注æå° c æå b æå
³èçæ°ç»æ¯å
许çãè¿è¦æ³¨æï¼å¯¹äºè¿äºç®çï¼å
³èå°é常æéçâæ°ç»âï¼ä»
表示æ°ç»å¯¹è±¡çé£ä¸é¨åå®é
䏿¯ç±è¯¥æéå¼ç¨çã
注æå¨ä¸ä¾ä¸ï¼ç¼è¯å¨è½æ¨æ a å b ä¸ä¼å«å使ç¨ï¼å 为 b ç常æ§ç¡®ä¿è¿ç¹ä¸ä¼åå¾ä¾èµå½æ°ä½ãç¨åºåè½çä»·å°å void f(int n, float * a, float const * restrict b) ï¼è¯¥æ åµä¸ç¼è¯å¨çè§£æ æ³ä¿®æ¹éè¿ b å¼ç¨ç对象ï¼è以 b å a ä¸åå¼ç¨ç对象ä¹ä¸ä¼è¢«ä¿®æ¹ãåå¦ç¨åºåè¦å void f(int n, float * restrict a, float * b) ï¼åç¼è¯å¨ä¸æ£éªå½æ°ä½å°±æ æ³æ¨æåº a å b ä¸ä¼å«å使ç¨ã
é常æ åµä¸ï¼æå¥½å¨å½æ°ååä¸ç¨ restrict æ¾å¼æ 注ææä¸ä¼å«å使ç¨çæéã
åä½ç¨å
ä¸ä¸ªåä½ç¨åç restrict é宿éä¼åä¸ä¸ªéäºå ¶åå çå«åå¼ç¨æè¨ãå®å 许å±é¨æè¨ä» åºç¨å°éè¦çåï¼è¬å¦ç´§å循ç¯ãå®äº¦ä½¿å¾å°ä½¿ç¨ restrict é宿éç彿°è½¬æ¢æå®æä¸ºå¯è½ï¼
float x[100]; float *c; #define f3(N, A, B) \ { int n = (N); \ float * restrict a = (A); \ float * const b = (B); \ int i; \ for ( i=0; i<n; i++ ) \ a[i] = b[i] + c[i]; \ }
ç»æä½æå
ä½ä¸ºç»æä½æåç restrict é宿éï¼æåçå«åå¼ç¨æè¨ä½ç¨åï¼æ¯ç¨äºè®¿é®è¯¥ç»æä½çæ è¯ç¬¦çä½ç¨åã
å³ä½¿ç»æä½å£°æäºæä»¶ä½ç¨åï¼å½ç¨ä»¥è®¿é®æ¤ç»æä½çæ è¯ç¬¦æ¥æåä½ç¨åæ¶ï¼ç»æä½ä¸çå«åå¼ç¨æè¨äº¦æ¥æåä½ç¨åï¼å«åå¼ç¨æè¨ä» å¨åæ§è¡æå½æ°è°ç¨ä¸çæï¼å ·ä½åå³äºæ¤ç»æä½ç±»åç对象æ¯å¦ä½åé çï¼
struct t { // restrict æéæè¨ int n; // æåæåæ 交éçåå¨åºã float * restrict p; float * restrict q; };  void ff(struct t r, struct t s) { struct t u; // r ã s ã u æ¥æåä½ç¨å // r.p ã r.q ã s.p ã s.q ã u.p ã u.q åºè¯¥å¨ // æ¯æ¬¡æ§è¡ ff æ¶å ¨é¨æåæ 交éçåå¨åºã // ... }
å ³é®è¯
示ä¾
代ç çææ ·ä¾ï¼ä»¥ -S ï¼ gcc ã clang çï¼æ /FA ï¼ Visual Studio ï¼åæ°ç¼è¯
int foo(int *a, int *b) { *a = 5; *b = 6; return *a + *b; } Â int rfoo(int *restrict a, int *restrict b) { *a = 5; *b = 6; return *a + *b; }
å¯è½çè¾åºï¼
# çæ64ä½Intelå¹³å°ç代ç ï¼
foo:
movl $5, (%rdi) # åå¨ 5 äº *a
movl $6, (%rsi) # åå¨ 6 äº *b
movl (%rdi), %eax # ä» *a 读åå¼ï¼èèå°åé¢çåå¨ä¼ä¿®æ¹å®
addl $6, %eax # å°ä» *a 读å¾çå¼å 6
ret
Â
rfoo:
movl $11, %eax # ç»ææ¯ 11ï¼ç¼è¯æ¶å¸¸é
movl $5, (%rdi) # åå¨ 5 äº *a
movl $6, (%rsi) # åå¨ 6 äº *b
retå¼ç¨
- C11 standard (ISO/IEC 9899:2011):
- 6.7.3.1 Formal definition of restrict (p: 123-125)
- C99 standard (ISO/IEC 9899:1999):
- 6.7.3.1 Formal definition of restrict (p: 110-112)