C语言中restrict的作用
来源:互联网 发布:鬼魂探测器软件 编辑:程序博客网 时间:2024/05/18 17:40
关键字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; restar[n]+= 5; ar[n]*= 2; par[n]+= 3; restar[n]+= 3;}知道了restar是访问它所指向的数据的唯一初始方式,编译器就可以用具有同样效果的一条语句来替代包含restar的两个语句
restar[n]+= 8;/*可以替换*/
然而将两个计算par的语句精简为一个则会导致错误因为在par两次访问数据之间,ar改变了该数据的值。没有关键字restrict,编译器将不得不设想比较糟糕的那一种形式,而使用之后,编译器可以放心大胆的寻找计算的捷径。可以将关键字作为指针型函数参量的限定词使用,这意味着编译器可以假定在函数体内没有其他标志符修改指针指向的数据,因而可以试着优化代码,反之不然。来看一下C99标准下C库中的两个函数,他们从一个位置把字节复制到另一个位置
void*memcpy(void* restrict s1,const void* restrict s2,size_t n);void*memmove(void* s1,const void * s2,size_t);memcpy要求两个指针的位置不能重叠,但memmove没有这个要求。把s1,s2声明为restrict意味着每个指针都是相应数据的唯一访问方式,因此他们不能访问同一数据块。这满足了不能有重叠的要求。 关键字restrict有两个读者:编译器,它告诉编译器可以自由地做一些优化的假定。另一个读者是用户,他告诉用户仅使用满足restrict要求的参数。一般,编译器没法检查你是否遵循了这一限制,如果你蔑视它,也就是让自己冒险。
阅读全文
0 0
- C语言中restrict的作用
- c语言中restrict关键字的理解
- C语言的 restrict
- C语言中关键字auto、static、register、extern、volatile、restrict的作用
- C语言中restrict关键字
- c语言中restrict和const的区别
- c语言中volatile和restrict的解释
- C语言中关键字restrict的用法(linux 为 __restrict)
- C语言中const,volatile,restrict的用法总结
- C语言中const,volatile,restrict的用法总结
- C语言中restrict关键字学习
- C语言中 restrict 关键字学习
- C语言中restrict关键字学习
- C语言中restrict关键字学习
- C语言中restrict关键字学习
- C语言中restrict关键字学习
- C语言中restrict关键字学习
- C语言中const,volatile,restrict
- HDU 6097 Mindis(计算几何)
- 刷题——Stall Reservations POJ
- JavaWeb-ssm框架搭建
- js打开本地exe程序
- power designer远程连接oracle数据库并导出E-R图
- C语言中restrict的作用
- 《Drools7.0.0.Final规则引擎教程》番外实例篇——默认条件的陷阱
- javaSE和JavaEE的区别?
- DAY58JavaScript DOM大纲
- 以Postgre SQL冷备为主线实现Portal for ArcGIS 10.5至10.5.1的迁移
- 454. 4Sum II
- HDU 1257 最少拦截系统 dp 最长上升子序列
- Linux常用命令集合(一)
- MFC文件操作