首页 > 学技术 > 技术网文 > C/C++ > 正文

[保留] 哪位达人解释一下C99中新关键字restrict的用法和含义


来源 chinaunix.net kuqin整理

FILE *fopen(const char *restrict pathname, const char *restrict type);

FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);

这些函数的参数都用restrict声明了,查了google大概是编译优化方面的问题,哪位能解释一下,什么时候该用restrict,怎么用??谢谢



 wuye_chinaunix 回复于:2006-09-27 14:57:50

顶一个!


 BenBear 回复于:2006-09-27 16:31:36

似乎 restrict 声明一个字符串(或数组)只能通过一个指针变量来访问。也就是保证,除了指定的函数调用,字符串不会在其它地方被修改,相当于传递给函数的会是“专有”字符串。

http://www.devx.com/tips/Tip/13825


 fantix 回复于:2006-09-28 17:24:44

[size=4]restrict 关键字只能用于指针。表明该指针是访问数据的唯一且初始的方式。
看个例子啊 
int * restrict rptr = (int*) malloc(10*sizeof(int));
此时rptr是访问有malloc分配的内存的唯一且初始的方式。这样呢,首先可以让编译器优化一些代码,增强了计算支持。
例如: 
int * restrict rptr = (int*) malloc(10*sizeof(int));
int a[10];
int * ptr;
ptr = a;
for(int i =0; i<10;i++)

   ptr += 5;
   rptr +=5;
   a *= 5;
   ptr += 3;
   rptr += 3;

}
当编译器知道rptr是访问它所指相的数据块的唯一方式时,就会用
rptr += 8 来代替上面的两条语句。
而 ptr += 8 就不能轻易去替换了,因为它不是访问数据的唯一方式。

restrict 若是用来修饰函数参数,也有同样的要求.即所传入的参数要满足restric的要求,编译器虽不会强制检查,但是如果你忽略掉时,可能会产生问题[/size]


 default_user 回复于:2006-09-28 21:34:25

引用:原帖由 fantix 于 2006-9-28 17:24 发表
[size=4]restrict 关键字只能用于指针。表明该指针是访问数据的唯一且初始的方式。
看个例子啊 
int * restrict rptr = (int*) malloc(10*sizeof(int));
此时rptr是访问有malloc分配的内存的唯一且初始的方式。 ... 



$ gcc -Wall -o test test.c
test.c: In function 'main':
test.c:5: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rptr'
test.c:5: error: 'rptr' undeclared (first use in this function)
test.c:5: error: (Each undeclared identifier is reported only once
test.c:5: error: for each function it appears in.)
test.c:14: error: invalid operands to binary *
你的程序有错误。
其实,restrict的作用就是限制一个指针对一块内存的访问,进一步说就是如果一块内存区域通过一个受限制指针访问,那么它就不能通过另一个受限指针访问。引入restrict的目的是确保同一块内存上没有其它引用,让编译器更好地优化指令,生成更有效的汇编代码。


 amy_4 回复于:2006-10-10 15:00:35

两个指针所指向的内容不存在重叠的时候使用


 ferryyang 回复于:2006-12-05 14:58:11

如果是只读区域,或在指针生存期内,该区域不会被修改,则两个restrict指针可以同时指向这一区域。




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=834736
转载请注明作者名及原文出处



收藏本页到: