我正在阅读库(QNNPack)的源代码并注意到这一行(https://github.com/pytorch/QNNPACK/blob/24d57f21503ba8ab0f8bb5d24148754a91266b9c/src/q8gemm/6x4-neon.c#L23 https://github.com/pytorch/QNNPACK/blob/24d57f21503ba8ab0f8bb5d24148754a91266b9c/src/q8gemm/6x4-neon.c#L23):
void funcName(...,
const union some_union_type some_union_arg[restrict static 1]) {
// ...
}
我理解关键字restrict
and static
一般来说,但恐怕我不知道这背后的原因。我在谷歌上没有找到任何东西,也许我搜索错了。
我猜这是告诉编译器该指针指向单个对象的一种方式。但我缺乏进一步解释的优化知识。
Thanks!
static
根据 C 标准,在此上下文中具有以下含义:
6.7.6.3 函数声明符(包括原型)
7 https://port70.net/~nsz/c/c11/n1570.html#6.7.6.3p7...如果关键字 static 也出现在 [ 和 ] 中
数组类型推导,然后对于该函数的每次调用,
相应实际参数的值应提供对
数组的第一个元素,其元素数量至少与大小表达式指定的元素数量相同。
这是对程序的语义要求。如果函数的调用者不支持它,则行为是未定义的,并且他们有一个必须修复的错误。由于指定的大小是1
,这意味着该函数需要一个指向单个的有效指针union some_union_type
对象,并传递它说NULL
其本身就是未定义的行为。
这是在原型中指定传递的指针必须有效的一种方法。理论上,编译器可以利用此信息并在传递 null 时发出警告。实际上,这明确地记录了对该参数的要求,并且该函数甚至可以选择在访问它之前不检查指针是否有效(因为它在其原型中指定的合约demands一个有效的指针)。
The restrict
指针上的限定符意味着该函数假定指针是直接或间接访问该数据的唯一方式。例如,如果您将其在实现中访问的全局对象的地址传递给它,则行为将是未定义的。这种假设促进了编译器在某些地方的优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)