很多人说这个关键字主要是用来加强编译器优化的,理由也很简单:“由restrict修饰的指针是最初唯一对指针所指向的对象进行存取的办法,仅当第二个指针基于第一个时,才能对对象进行存取.”这样下面的代码就可以被很好的优化,
void fcpy(float* restrict a, float *restrict b, float *restrict aa, float *restrict bb, int n)
{
int i;
for(i = 0; i < n; i++)
{
aa[i]=a[i];
bb[i]=b[i];
}
}
这意味着这些拷贝循环能够“并行”(in parallel),由于例如 aa != b
但还是喜欢下面的例子,从它可以看出restrict不仅仅可以被用来加强编译器的优化,还是解决我们代码中存在的隐患。
备注:restrict用来将指针和访问对象(例如数组)进行一一绑定, 这样相当于告诉编译器各个访问对象之间的不存在依赖关系, 利于编译器优化!
再比如以下的例子
int ar[10];
int * restrict restar = (int *) malloc(10 * sizeof(int));
int * par = ar;
for (n = 0; n < 10; n++)
{
par[n] += 5;
restar[n] += 5;
ar[n] *= 2;
par[n] += 3;
restar[n] += 3;
}
restar指针是restrict类型,par指针就不是,因为par即没有初始化也不是唯一访问ar数组的变量。
那么,上面的程序,因为restar是唯一反问数据块的指针,所以编译器可以对它优化为一条语句,restar[n] += 8; /* ok replacement */
而par就不可以做类似上述优化;