__restrict只有一个指针的指针锯齿

__restrict pointer aliasing with only one pointer

本文关键字:指针 有一个 restrict      更新时间:2023-10-16

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

int longCalculation(int a, int* __restrict b)

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

正如评论中提到的,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;
   ...
}

IMO 这具有以下优点:

  • 函数签名不会公开使用的非标准__restrict
  • 确保变量实际上符合使用assert __restrict的能力,因为将混叠指针传递给期望它们是非混叠的函数可能会导致难以追踪错误。
相关文章: