__restrict只有一个指针的指针锯齿
__restrict pointer aliasing with only one pointer
如果函数指针参数是唯一的指针参数,那么在函数指针参数上指定 MSVC/GCC 非标准__restrict
限定符有什么好处吗?例如
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
- 确保变量实际上符合使用
assert
__restrict
的能力,因为将混叠指针传递给期望它们是非混叠的函数可能会导致难以追踪错误。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 为什么我在C++中有一个空指针取消引用
- 为什么静态指针返回函数中有一个"静态"键?
- 从指向成员的指针的模板推导,其中至少有一个指向成员的指针是已知的
- 带有显式构造函数的智能指针使我有一个错误
- 删除指向排序的字符串阵列的指针会在运行后会有一个错误
- 难道不应该有一个类似于"this"的与名称无关的类指针供成员函数在C++中引用吗?
- 指针怎么能有一个字符串作为它的值
- 我可以有一个模板函数指针的 std::vector 吗?
- 如果我有一个将指针变量作为输入的函数,有没有办法将函数作为参数传递
- 是否有可能有一个指针指向由奇怪的递归模板创建的基类
- 系统存储中的证书上下文总是有一个无效的pbCertEncoded指针
- C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量
- 有一个可以是指针类型或非指针类型的模板参数
- 我有一个指向自定义项的未初始化指针表,我想检查是否已经存在某些内容
- C#:Cdecl-DllExport,参数中有一个指向类实例的指针