鱼C论坛

 找回密码
 立即注册
查看: 4102|回复: 3

c语言限定词问题

[复制链接]
发表于 2012-9-27 19:51:21 | 显示全部楼层 |阅读模式
10鱼币
3.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;

restar[n] += 5;

ar[n] *= 2;

par[n] += 3;

restar[n] += 3;

}

知道了restar是访问它所指向的数据的唯一初始方式,编译器就可以用具有同样效果的一条语句来替代包含restar的两个语句

restar[n] += 8;

然而将两个计算par的语句精简为一个则会导致错误因为在par两次访问数据之间,ar改变了该数据的值。没有关键字restrict,编译器将不得不设想比较糟糕的那一种形式,而使用之后,编译器可以放心大胆的寻找计算的捷径。可以将关键字作为指针型函数参量的限定词使用,这意味着编译器可以假定在函数体内没有其他标志符修改指针指向的数据,因而可以试着优化代码,反之

问个问题,,,然而将两个计算par的语句精简为一个则会导致错误因为在par两次访问数据之间,ar改变了该数据的值  这句话 什么意思  改变什么值了???



补充内容 (2012-9-27 20:01):
哥哥我明白了,咋整。。10鱼币没了

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-27 20:02:03 | 显示全部楼层
貌似飞速的扫过这部分内容。。。。
LZ看见ar中间的那个ar[n]*=2了没有?,这样就改变了ar[n]的值,如果生命为restrict导致合并的时候计算错误。为什么呢?因为编译器会把restrict“+=”的归类合并一起计算,不考虑语句的顺序,这样就出错了。
我是这么理解的。。。编译器对restrict会偷懒
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-27 20:55:20 | 显示全部楼层
。。。我居然从来没见到过这个关键字。。。
嗨~~~丢脸啊~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-27 22:43:11 | 显示全部楼层

int * par = ar 对的,因为前面有这个复赋值
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-15 07:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表