8

我有一个接收指针数组的函数,如下所示:

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];
     }
}

我想传达给编译器的是指针ptrs[i]不是彼此的别名,并且数组ptrs[i]不重叠。我该怎么做?我别有用心是鼓励自动矢量化。

__restrict__另外,有没有办法获得与a 的迭代器相同的效果std::vector

4

3 回答 3

9

restrict与更常见的不同const,是指针的属性而不是指向的数据。因此它属于' ' 声明符修饰符的右侧。在参数声明中是另一种写法。把这些东西放在一起,你应该可以用这个函数原型得到你想要的效果:*[]*

void foo(int *restrict *restrict ptrs, int num, int size)
{
   /* body */
}

并且不需要新名字。(未经测试。您的里程可能会有所不同。 restrict这是一个纯粹的优化提示,实际上可能不会对您的编译器做任何建设性的事情。)

于 2011-09-07T03:24:50.977 回答
7

就像是:

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];
     }
}

...我认为应该在 C99 中这样做。我认为 C++ 中没有任何方法,但许多 C++ 编译器也支持限制。

于 2011-09-07T03:13:05.793 回答
4

在 C++ 中,如果指针参数指向根本不同的类型(“严格别名”规则),则假定它们不具有别名。

在 C99 中,“restrict”关键字指定指针参数不为任何其他指针参数设置别名。

于 2011-09-07T03:11:58.913 回答