使用仅一个指针的__restrict指针别名

7

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

int longCalculation(int a, int* __restrict b)

我的猜测是使用 __restrict 可以更好地进行优化,因为它表明 b 并不指向 a,但我看到的所有例子都是用 __restrict 限定两个指针,以表示它们之间没有别名。


3
无论如何,b都不能指向a!这是不可能的。试试看。 - R. Martinho Fernandes
1
好观点,因为a是按值传递的。没有考虑到这一点。 - jarmond
“restrict” 实际上是 C99 标准的一部分,因此这并不完全是非标准的(尽管我认为任何 C++ 规范都尚未采用它)。 - Jonathan Grynspan
1
@JonathanGrynspan:实际上这是非标准的!restrict关键字在任何C++标准中都不存在(包括最近的C++11)。 - MFH
啊,我以为C++11可能已经采用了它。 :) - Jonathan Grynspan
1个回答

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;
   ...
}

我认为这样做有以下几个优点:

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

你的代码别名为 bxb,而且正是 restrict 保证永远不会发生的情况。 - KitsuneYMG
1
@KitsuneYMG:restrict并不保证什么。它的作用是向编译器承诺,在指向受限指针的生命周期内,不会通过任何其他方式(指针)访问所指向的数据。因此,只要在函数内部不对b进行解引用操作(这应该很明显是个坏主意),将bx设置为指向b就不会有问题。 - Grizzly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接