__restrict 指针别名只有一个指针

jar*_*ond 7 c++ gcc visual-c++

__restrict如果函数指针参数是唯一的指针参数,那么在函数指针参数上指定 MSVC/GCC 非标准限定符有什么好处 吗?例如,

int longCalculation(int a, int* __restrict b)
Run Code Online (Sandbox Code Playgroud)

我的猜测是它应该允许更好的优化,因为它暗示b不指向a,但我见过的所有示例都有__restrict两个指针来表示它们之间没有别名。

Gri*_*zly 4

正如评论中提到的无论如何b都不能指向a,所以无论如何都不存在混叠的可能性。因此,如果该函数是纯粹的,即它仅对其参数起作用,那么就不会有任何真正的好处。

但是如果函数使用全局变量,那么__restrict可能会再次带来好处,因为它清楚地表明它b不指向任何这些全局变量。

一个有趣的情况可能是在函数内部分配和释放内存的情况。理论上,编译器可以确保b不指向该内存,但是它是否意识到我不确定,并且可能取决于分配的调用方式。

但就我个人而言,我更喜欢远离__restrict签名并做类似的事情

int longCalculation(int a, int* b){ 
   assert(...);//ensure that b doesn't point to anything used
   int* __restrict bx = b;
   ...
}
Run Code Online (Sandbox Code Playgroud)

IMO 这有以下优点:

  • 函数签名不会暴露非标准__restrict函数签名不会暴露使用的
  • 确保变量实际上符合__restrictusing 的能力assert,因为将别名指针传递给期望它们是非别名的函数可能会导致难以追踪错误。