__restrict
如果函数指针参数是唯一的指针参数,那么在函数指针参数上指定 MSVC/GCC 非标准限定符有什么好处 ?例如,
int longCalculation(int a, int* __restrict b)
我的猜测是它应该允许更好的优化,因为它暗示b
不指向a
,但是我看到的所有示例都有__restrict
两个指针来指示它们之间没有别名。
__restrict
如果函数指针参数是唯一的指针参数,那么在函数指针参数上指定 MSVC/GCC 非标准限定符有什么好处 ?例如,
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
函数签名不暴露使用的非标准__restrict
using 的能力assert
,因为将别名指针传递给期望它们是非别名的函数可能会导致难以追踪错误。