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