所以我正在阅读一篇关于优化int块的排序的博客,其实现在c中。我走过这条线,我不明白:
void nibble_sort_bucket(uint64_t buf[static 1024]) {
缓冲区基本上是要排序的数据,并且其中的每个int都得到4位排序的块,所以它基本上用于基准测试。 当我在c中查找静态的使用时,我发现了两件事。
这些都没有意义。有人可以解释为什么你会在一个数字前写静态,这会做什么?
答案 0 :(得分:9)
这是static
关键字的第三个含义,它是在C99中引入的,但它并不是众所周知的特征。它的目的是告诉编译器,您传递的数组至少包含1024个元素。
来自C99(N1256)§6.7.5.3/ p7 函数声明符(包括原型)(强调我的):
如果关键字
static
也出现在数组的[
和]
中 类型派生,然后对每个函数的调用,值的 相应的实际参数应提供对第一个的访问权限 数组的元素,其元素至少与指定的元素一样多 大小表达。
实际实施之间存在一些差异。例如,clang
抛出一个警告,当传递的数组不满足上面的子条款时。例如:
#include <stdio.h>
void foo(int a[static 10]) {}
int main()
{
int array[8] = {0};
foo(array);
}
给出:
警告:数组参数太小;包含8个元素,被调用者 需要至少10 [-Warray-bounds]
虽然gcc
实现不执行任何操作(有关详细信息,请参阅GCC bug 50584)。
答案 1 :(得分:1)
此语句buf[static 1024]
告诉编译器 buf 至少为1024个字符。它用于优化,换句话说,它想说 buf 永远不会为空。