免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4854 | 回复: 6
打印 上一主题 下一主题

哪位达人解释一下C99中新关键字restrict的用法和含义 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-27 11:49 |只看该作者 |倒序浏览
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,怎么用??谢谢

论坛徽章:
0
2 [报告]
发表于 2006-09-27 14:57 |只看该作者
顶一个!

论坛徽章:
0
3 [报告]
发表于 2006-09-27 16:31 |只看该作者
似乎 restrict 声明一个字符串(或数组)只能通过一个指针变量来访问。也就是保证,除了指定的函数调用,字符串不会在其它地方被修改,相当于传递给函数的会是“专有”字符串。

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

论坛徽章:
0
4 [报告]
发表于 2006-09-28 17:24 |只看该作者
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的要求,编译器虽不会强制检查,但是如果你忽略掉时,可能会产生问题

论坛徽章:
0
5 [报告]
发表于 2006-09-28 21:34 |只看该作者
原帖由 fantix 于 2006-9-28 17:24 发表
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的目的是确保同一块内存上没有其它引用,让编译器更好地优化指令,生成更有效的汇编代码。

论坛徽章:
0
6 [报告]
发表于 2006-10-10 15:00 |只看该作者
两个指针所指向的内容不存在重叠的时候使用

论坛徽章:
0
7 [报告]
发表于 2006-12-05 14:58 |只看该作者
如果是只读区域,或在指针生存期内,该区域不会被修改,则两个restrict指针可以同时指向这一区域。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP