7894|2

6040

帖子

195

TA的资源

版主

楼主
 

C语言中关键字restrict的用法 [复制链接]

 类型限定词restrict
关键字restrict通过允许编译器优化某几种代码增强了计算支持。它只可用于指针,并表明指针是访问一个数据对象的惟一且初始的方式。为了清楚这样做为何有用,我们需要看一些例子。考虑下面的代码:
int ar[10];
int * restrict restar = (int *) malloc(10 * sizeof(int));
int * par = ar;
这里,指针restar是访问由malloc()分配的内存的惟一且初始的方式。因此,它可以由关键字restrict限定。然而,par指针既不是初始的,也不是访问数组ar中数据的惟一方式,因此不可以把它限定为restrict。
现在考虑下面这个更复杂的例子,其中n是一个int:
for(n=0; n < 10; n++)
{
par[n] += 5;
restart[n] += 5;
ar[n] *= 2;
par[n] += 3;
restar[n] += 3;
}
知道了restar是访问它所指向数据块的惟一初始方式,编译器就可以用具有同样效果的一条语句来代替包含restar的两个语句:
restar[n] += 8;
然而,将两个包含par的语句精简为一个语句将导致计算错误:
par[n] += 8;
出现错误结果的原因是循环在par两次访问同一个数据之间,使用ar改变了该数据的值。
没有关键字restrict,编译器将不得不设想比较糟的那种情形,也就是两次使用指针之间,其他标识符可能改变了数据的值。使用restrict关键字之后,编译器可以放心地寻找计算的捷径。
可以将关键字restrict作为指针型函数参量的限定词使用。这意味着编译器可以假定在函数体内没有其他标识符修改指针指向的数据,因而可以试着优化代码,反之则不然。例如,C库中有两个函数可以从一个位置把数据复制到另一个位置。在C99标准下,他们的原型如下:
void * memcpy(void * restrict dst, const void * restrict src, size_t n);
void * memmove(void * dst, const void * src, size_t n);
两个函数都从位置src把n个字节复制到dst中。函数memcpy()要求两个位置之间不重叠,但memmove()没有这个要求。把dst和src声明为restrict意味着每个指针都是相应数据的惟一访问方式,因此他们不能访问同一数据块。这满足了不能有重叠的要求。函数memmove()允许重叠,它不得不在复制数据时更加小心,以防在使用数据前就覆盖了数据。
关键字restrict有两个读者。一个是编译器,它告诉编译器可以自由地做一些有关优化的假定。另一个读者是用户,它告诉用户仅使用满足restrict要求的参数。一般,编译器无法检查您是否遵循了这一限制,如果您蔑视它也就是在让自己冒险。
(以上大部分内容摘自《C Primer Plus》)

最新回复

:carnation:  详情 回复 发表于 2012-9-17 22:02
点赞 关注
 

回复
举报

384

帖子

2

TA的资源

纯净的硅(初级)

沙发
 
学习了。。。
 
 
 

回复

1万

帖子

16

TA的资源

版主

板凳
 

讲得深,我平是好像没用过这个关键词

:carnation:
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表