如何告诉C或C ++编译器指针没有别名

时间:2011-09-07 03:08:08

标签: c++ c pointers 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];
     }
}

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

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

3 个答案:

答案 0 :(得分:9)

与更常见的restrict不同,

const指针的属性,而不是指向的数据。因此,它属于“*”声明符修饰符的右侧侧。参数声明中的[]是另一种写*的方法。把这些东西放在一起,你应该能够通过这个函数原型获得你想要的效果:

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

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

答案 1 :(得分: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 ++编译器也支持限制。

答案 2 :(得分:4)

在C ++中,如果指针参数指向基本上不同的类型(&#34;严格别名&#34;规则),则假定它们不是别名。

在C99中,&#34;限制&#34; keyword指定指针参数不会为任何其他指针参数设置别名。