关于restrict关键字

restrict是用来优化的,是C99新加的关键字,估计流行的编译器还不支持。 
你可以把restrict删除,然后直接编译,运行结果一样的,最多慢一点。
C/C++灵活的语法限制了它们的计算速度。譬如这个函数: 
void func(const int* values1,const int* values2,int* values3,int valueNum) 

for(int i=0;i<valueNum;++i) 
values3[i]+=value1[i]*values2[i]; 

如果CPU支持矩阵运算,譬如可以用一条指令来计算两个向量的积,上面这个函数就可以被优化为一条指令。但是,事实上是不可能的。因为这种指令可能是: 
a.先读入两个向量的所有值到寄存器 
b.计算,将结果寄存器里。 
c.写回计算结果。 
所以,上面这个不能被优化,因为编译器不能保证values1和values2的内容在这个循环里不改变。因为,虽然有const修饰,但是这个const是语法/语义上的,而不一定是真实的。譬如,有个人这样调用这个函数: 
int a[10]; 
func(a,a,a,10); 
这样,如果用那个特殊指令去优化,可能造成实际结果和预计结果不一样。所以,不能优化。 
但是如果你把前两个指针声明为restrict,就表示,在这个函数内,这两个指针的值得任何改变,都是通过这两个指针进行的。这样,编译器就可以自由优化了。从而使C可以达到Fortran一样的运算效率。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值