restrict关键字有多严格?

时间:2014-06-27 16:10:17

标签: c pointers

我有以下简单的功能

static inline void
minVec(const double *restrict v, double *restrict vmin, unsigned length){
  for (unsigned i = 0; i < length; ++i)
    vmin[i] = -v[i];
  return;
}

当我以这种方式使用它时编译和运行就好了

double v[] = {1, 2, 3};
minVec(v, v, 3);

我一直认为在这种情况下使用restrict只会告诉编译器循环的每次迭代都独立于其他迭代,因此可以积极地优化循环。这是正确的做法吗?还是我在这里尝试一些实现定义的行为?

2 个答案:

答案 0 :(得分:5)

restrict关键字纯粹是一个优化提示:它允许编译器对所有其他内存访问的受限指针重新排序读/写。如果编译器无法证明指针后面的内存只能通过该指针访问,则无法完成此操作。

所以,如果你说restrict,你有效地告诉编译器:&#34;我向你保证这个指针是唯一一个指向这个内存的指针,请随时重新排序。我充分意识到,如果我错了,可能会出现蓝色大象,但我是人类,我可能会出错,在我面前鞠躬。&#34;

这个关键字是为了编译器,不是为了你自己!

答案 1 :(得分:3)

使用restrict关键字表示副本的来源和目标不应重叠不保证副本和目标的来源重叠。如果它发生,程序会调用未定义的行为,这就是你的情况。