restrict关键字

     很多人说这个关键字主要是用来加强编译器优化的,理由也很简单:“由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就不可以做类似上述优化;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值