san*_*san 8 c c++ pointers pointer-aliasing restrict-qualifier
我有一个接收指针数组的函数,如下所示:
void foo(int *ptrs[], int num, int size)
{
/* The body is an example only */
for (int i = 0; i < size; ++i) {
for (int j = 0; j < num-1; ++j)
ptrs[num-1][i] += ptrs[j][i];
}
}
Run Code Online (Sandbox Code Playgroud)
我想传达给编译器的是指针ptrs[i]不是彼此的别名,并且数组ptrs[i]不重叠.我该怎么办?我别有用心的是鼓励自动矢量化.
另外,有没有办法获得与__restrict__a的迭代器相同的效果std::vector?
restrict,与更常见的不同const,是指针的属性而不是指向的数据.因此它属于' 'declarator-modifier 的右侧*.[]在参数声明中是另一种写入方式*.把这些东西放在一起,你应该能够通过这个函数原型获得你想要的效果:
void foo(int *restrict *restrict ptrs, int num, int size)
{
/* body */
}
Run Code Online (Sandbox Code Playgroud)
而且不需要新名字.(未经测试.您的里程可能会有所不同.这 restrict是一个纯粹的优化提示,实际上可能不会对您的编译器做任何有建设性的事情.)
就像是:
void foo(int *ptrs[], int num, int size)
{
/* The body is an example only */
for (int i = 0; i < size; ++i) {
for (int j = 0; j < num-1; ++j) {
int * restrict a = ptrs[num-1];
int * restrict b = ptrs[j];
a[i] += b[i];
}
}
Run Code Online (Sandbox Code Playgroud)
......我认为应该在C99中做到这一点.我认为在C++中没有任何方法,但许多C++编译器也支持限制.
| 归档时间: |
|
| 查看次数: |
954 次 |
| 最近记录: |