C中修饰符restrict 的用法
来源:互联网 发布:升级淘宝网2017新版本 编辑:程序博客网 时间:2024/05/22 17:25
restrict
C库例子编辑本段
考虑下面的例子:
int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;
这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。
那么:
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并不是访问数组ar的唯一方式,因此并不能进行下面的优化:
par[n]+=8;
因为在par[n]+=3前,ar[n]*=2进行了改变。使用了关键字restrict,编译器就可以放心地进行优化了。
这个关键字据说来源于古老的FORTRAN。有兴趣的看看这个。
3 例子编辑本段
C库中有两个函数可以从一个位置把字节复制到另一个位置。在C99标准下,它们的原型如下:
void * memcpy(void * restrict s1, const void * restrict s2, size_t n);
void * memove(void * s1, const void * s2, size_t n);
这两个函数均从s2指向的位置复制n字节数据到s1指向的位置,且均返回s1的值。两者之间的差别由关键字restrict造成,即memcpy()可以假定两个内存区域没有重叠。memmove()函数则不做这个假定,因此,复制过程类似于首先将所有字节复制到一个临时缓冲区,然后再复制到最终目的地。如果两个区域存在重叠时使用memcpy()会怎样?其行为是不可预知的,既可以正常工作,也可能失败。在不应该使用memcpy()时,编译器不会禁止使用memcpy()。因此,使用memcpy()时,您必须确保没有重叠区域。这是程序员的任务的一部分。[1]关键字restrict有两个读者。一个是编译器,它告诉编译器可以自由地做一些有关优化的假定。另一个读者是用户,他告诉用户仅使用满足restrict要求的参数。一般,编译器无法检查您是否遵循了这一限制,如果您蔑视它也就是在让自己冒险。
以上来源于链接:http://baike.so.com/doc/5946574.html
- C中修饰符restrict 的用法
- C/C++ restrict修饰符
- C/C++中存储类型修饰符的区别(auto、static、register、extern、volatile、restrict)
- C/C++中存储类型修饰符的区别(auto、static、register、extern、volatile、restrict)
- C中extern修饰符的用法
- C++中restrict修饰符作用
- C语言中关键字restrict的用法(linux 为 __restrict)
- C语言中const,volatile,restrict的用法总结
- C中const,volatile,restrict关键字的用法
- C语言中const,volatile,restrict的用法总结
- restrict修饰符
- C++ 修饰符 restrict
- C语言中extern修饰符的用法
- C语言中extern修饰符的用法
- C语言中extern修饰符的用法
- C语言中extern修饰符的用法
- C/C++中const修饰符的用法总结
- Flex TextField 中 restrict 的用法
- Description Resource Path Location Type Java compiler level does not match the version of the insta
- UVa 11877 - The Coco-Cola Store
- hdu 1709 The Balance
- Cocos2d-x中播放背景音乐
- 通知传值
- C中修饰符restrict 的用法
- 【开源夏令营】PFIF公益寻人平台(四)
- QT:在QTableView中使用各种自定义委托
- 神经猫 系列资料
- Linux快速启动工具(四)
- HDU 1068 boys and girls(最大独立集)
- scanf()中的%c 不能正常输入的问题
- Asp.Net(IIS)运行后出现“.dll拒绝访问”错误的解决方法(已解决)
- 网络连接的常见问题和解决方法