restrict关键字有多严格?

dow*_*ere 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

double v[] = {1, 2, 3};
minVec(v, v, 3);
Run Code Online (Sandbox Code Playgroud)

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

cma*_*ter 5

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

所以,如果你说restrict,你有效地告诉编译器:"我向你保证,这个指针指向这个内存,请随时重新安排我充分意识到,如果我错了蓝色大象可能会出现只有一个,但我. "在人类面前,我不能错,在我面前低头."

这个关键字是为了编译器而不是为了你!

  • @downhillFromHere你的函数从`v [..]`读取并写入`vmin [..]`.显然,如果两个数组相同并且这些读写操作被重新排序,那么最终结果将不会相同.你使用`restrict`告诉编译器"继续,如果你想要重新排序".您很幸运,您所使用的特定版本中的特定编译器使用您选择的优化选项,并未将操作重新排序,从而将结果更改为您不想要的结果. (2认同)
  • 从理论上讲,`restrict`不一定只是一个优化提示:它可以用来为看起来不符合函数前提条件的调用发出警告.在实践中,它不方便,因为`restrict`的含义是根据函数对指针的作用来定义的.`f(t,t + 1)`允许`f(restrict int*p,restrict int*q)`如果`f`不能访问'*q`和`*(p + 1)`,禁止如果是的话.只有当`f`不能直接访问`G`时才允许传递`&G`.http://blog.frama-c.com/index.php?post/2012/08/02/restrict-not-modular (2认同)