如果函数指针参数是唯一的指针参数,那么在指定MSVC/GCC非标准的__restrict
限定符时是否有优势?例如:
int longCalculation(int a, int* __restrict b)
我的猜测是使用 __restrict
可以更好地进行优化,因为它表明 b
并不指向 a
,但我看到的所有例子都是用 __restrict
限定两个指针,以表示它们之间没有别名。
如果函数指针参数是唯一的指针参数,那么在指定MSVC/GCC非标准的__restrict
限定符时是否有优势?例如:
int longCalculation(int a, int* __restrict b)
我的猜测是使用 __restrict
可以更好地进行优化,因为它表明 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;
...
}
我认为这样做有以下几个优点:
__restrict
关键字;assert
来确保变量实际上符合 __restrict
,因为将别名指针传递给期望它们是非别名的函数可能导致难以跟踪的错误。bx
和 b
,而且正是 restrict
保证永远不会发生的情况。 - KitsuneYMGrestrict
并不保证什么。它的作用是向编译器承诺,在指向受限指针的生命周期内,不会通过任何其他方式(指针)访问所指向的数据。因此,只要在函数内部不对b
进行解引用操作(这应该很明显是个坏主意),将bx
设置为指向b
就不会有问题。 - Grizzly
b
都不能指向a
!这是不可能的。试试看。 - R. Martinho Fernandesa
是按值传递的。没有考虑到这一点。 - jarmond