c - `pointer[restrict static 1]` 在声明这样的指针时会带来什么优化好处?

标签 c compiler-optimization

我正在阅读库(QNNPack)的源代码并注意到这一行(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]) {
// ...
}

我理解关键字restrictstatic总的来说,但恐怕我不知道这背后的原因。我在谷歌上没有找到任何东西,也许我搜索错了。

我猜这是一种告诉编译器该指针指向单个对象的方法。但我缺乏进一步解释的优化知识。

谢谢!

最佳答案

static在此上下文中,根据 C 标准具有以下含义:

6.7.6.3 Function declarators (including prototypes)

7 ... If the keyword static also appears within the [ and ] of the array type derivation, then for each call to the function, the value of the corresponding actual argument shall provide access to the first element of an array with at least as many elements as specified by the size expression.



这是程序的语义要求。如果函数的调用者不支持它,则行为未定义,并且他们有一个必须修复的错误。由于指定的大小是 1 ,这意味着该函数需要一个指向单个 union some_union_type 的有效指针对象,并通过它说NULL本身就是未定义的行为。

这是一种在原型(prototype)中指定传递的指针必须有效的方法。编译器可以在理论上利用此信息并在传递 null 时发出警告。在实践中,这明确地记录了对该参数的要求,并且该函数甚至可以选择在访问指针之前不检查指针是否有效(因为它在其原型(prototype)中指定的合约需要一个有效指针)。
restrict指针上的限定符意味着函数假定指针是它直接或间接访问此数据的唯一方式。因此,例如,如果您将在其实现中访问的全局对象的地址传递给它,则行为将是未定义的。这个假设促进了编译器在某些地方的优化。

关于c - `pointer[restrict static 1]` 在声明这样的指针时会带来什么优化好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53863084/

相关文章:

c - 指向整数数组的指针

C - 哈希表键的链表

c++ - 对于最基本的示例,g++ 自动矢量化失败

GCC 编译器中的条件移动 (cmov)

c - 执行次数减少3倍,但执行效率几乎不变。在 C

c - 功能周围的杂注是否影响内部功能

c - 使用 scanf() 提取存储在字符串中的 URL 的域名扩展

c - 扫描: "%[^,]s"与 "%[^,],s"

c++ - 最小整数,但大于给定整数,并且包含相同的设置位数(2个整数具有相同的设置位数)。

c++ - 增量优化掉(Visual C Express 2010)