|
|
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鱼币没了 |
|