【问题标题】:Need suggestion for determining array size in C in efficient way需要建议以有效的方式确定 C 中的数组大小
【发布时间】:2015-01-20 05:09:00
【问题描述】:

在 java、java 脚本和其他语言中,有 array.length 函数可用于了解循环和其他需要的数组长度。在 C 编程中,我正在使用

sizeof()    

通过以下过程确定数组大小或数组长度的运算符:

  int array [] ={12, 3, 4, 6};

  for (int i = 0; i < (sizeof(array)/sizeof(int)); i++) {
 // do sometings
}

我想知道的是

  sizeof(array)/sizeof(int)

查找数组大小是否有效? 或者如果有其他有效的方法可用,请建议我。

【问题讨论】:

标签: c arrays


【解决方案1】:

它非常有效,因为它是一个导致编译时常量的构造(C99 VLA 除外,见下文)。您可能想使用:

sizeof(array)/sizeof(array[0])

相反,因此您可以将它与非 int 类型一起使用。也许将它包装在一个宏中(当然,所有关于使用宏时要小心的常见警告都适用)。

关于更新:对于我上面的原始答案,我没有考虑 C99 中的 VLA,其中:

如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。 (6.5.3.4/2)

VLA 数组元素的数量可能只能在运行时确定(并且评估本身可能有副作用),因此对于 VLA,它不是纯粹的编译时构造。在大多数格式良好的情况下,VLA 的代码级行为实际上是相同的。例如:

#include <stdio.h>

#define countof_array(arr)  (sizeof(arr)/sizeof(arr[0]))

int vlaSize(void)
{
  return 8;
}

int main(void)
{
   int fixed_array[9] = { 1,2,3,4,5,6,7,8,9 };
   int vla_array[vlaSize()];

   printf("Fixed array: size = %zu bytes, count = %zu elements\n", 
           sizeof(fixed_array), countof_array(fixed_array));
   printf("VLA array:   size = %zu bytes, count = %zu elements\n", 
           sizeof(vla_array), countof_array(vla_array));

   return 0;
}

结果:

$ gcc -Wall -std=c99 so-misc.c
$ ./a.out
Fixed array: size = 36 bytes, count = 9 elements
VLA array:   size = 32 bytes, count = 8 elements

在进一步编辑时,删除这部分:

警告:故意创建一个案例并不难,其中countof_array 的语义对于 VLA [...]

因为再想一想,我不确定这是否属实。在separate question 中询问这个问题。

无论如何,它仍然非常高效,因为首先要创建 VLA,编译器必须弄清楚 VLA 将占用多少空间。因此,即使不是 VLA 的编译时常量,它仍然是确定数组大小的最有效方法。

【讨论】:

  • @MattMcNabb 是否有运行时 sizeof 我不知道?
  • @MattMcNabb 如果你知道的话,我很想看看这个例子。整个互联网(包括我以前的自己)都坚持认为sizeof 是一个严格的编译时构造。
【解决方案2】:

sizeof 是一个编译时构造,意味着它的值是在编译期间确定的,所以它在运行时是免费的。运行时使用sizeof 的唯一“成本”是加载一个常量值,就像您对它进行硬编码一样。

换句话说,你的代码是高效的。

【讨论】:

    【解决方案3】:

    sizeof 是根据静态类型信息评估的(在编译时)。

    C99 的variable-length arrays (VLAs). 是一个例外

    C(自 C99 起)提供可变长度数组 (VLA) 和灵活数组成员 (FAM)。对于可变长度数组,sizeof 会评估其参数,因此存在(最小)运行时成本——大致相当于 C++ 中的std::vector::size()。 对于所有其他类型(包括包含灵活数组成员的structs),sizeof 不计算其操作数,因此没有运行时成本(与 C++ 中相同)。

    对于具有灵活数组成员的struct:“ 结构应等于最后一个元素的偏移量 否则替换灵活数组成员的相同结构 具有未指定长度的数组。”(C99,§6.7.2.1/16)。

    因此,使用等于该值的普通整数不会导致性能变化。

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多