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一样的运算效率。
你可以把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一样的运算效率。