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

How to tell a C or a C++ compiler that pointers are not aliased

本文关键字:指针 别名 编译器 C++ 何告诉      更新时间:2023-10-16

我有一个函数,它接收一个指针数组,比如:

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]不重叠。我该怎么做?我不可告人的动机是鼓励自动向量化。

此外,有没有一种方法可以在std::vector的迭代器上获得与__restrict__相同的效果?

restrict与更常见的const不同,是指针的属性,而不是指向。因此,它属于'*'声明符修饰符的右侧。参数声明中的[]是编写*的另一种方式。把这些东西放在一起,你应该能够通过这个功能原型获得你想要的效果:

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

并且不需要新名称。(未测试。您的里程可能会有所不同。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];
     }
}

我认为应该在C99中做到这一点。我不认为C++有任何方法,但许多C++编译器也支持restrict。

在C++中,如果指针参数指向根本不同的类型("严格别名"规则(,则假设它们不别名。

在C99中,"restrict"关键字指定指针参数不别名任何其他指针参数。

调用std::memcpy。如果您的语言/版本和编译器支持Memcpy的定义,则会设置restrict;如果复制区域的大小较小,则大多数编译器会将其降低为向量指令。