关于restrict关键字
来源:互联网 发布:淘宝lisa国潮是正品吗 编辑:程序博客网 时间:2024/06/06 10:50
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一样的运算效率。
- 关于restrict关键字
- 关于volatile和restrict关键字
- 关于volatile和restrict关键字
- 关于c99中restrict关键字的使用
- 关键字restrict
- restrict关键字
- restrict关键字
- restrict关键字
- restrict 关键字
- restrict关键字
- 关键字restrict
- restrict 关键字
- restrict关键字
- 关键字Restrict
- 关键字 -- restrict
- restrict关键字
- restrict 关键字
- restrict关键字
- ARRAY_MAP函数用法
- Eclipse中10个最有用的快捷键组合
- c 语言 内存 bug
- masm winasm 出现如下错误
- 内存越界导致的malloc失效问题
- 关于restrict关键字
- Leetcode: Binary Tree Inorder Traversal
- Fedora 18下安装VirtualBox
- C#转义大括号“{}”
- CareerCup 4.1
- UIButton创建不能使用UIButton alloc
- 黑马程序员——java代理技术
- git tutorial
- imshow(I, [low high]) matlab