__restrict指针别名只有一个指针

时间:2012-08-07 18:16:27

标签: c++ visual-c++ gcc

如果它是唯一的指针参数,那么在函数指针参数上指定MSVC / GCC非标准__restrict限定符是否有任何优势?例如,

int longCalculation(int a, int* __restrict b)

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

1 个答案:

答案 0 :(得分:2)

正如评论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
  • 使用__restrict确保变量实际符合assert的能力,因为将别名指针传递给期望它们是非混淆的函数会导致难以追踪错误。