何时使用静态数组与动态数组C

时间:2019-01-07 11:08:44

标签: c arrays memory dynamic static

我是C语言的新手,我只是想知道是否存在这样一种情况,一个人比另一个人更受青睐,是否仅取决于一个人的偏好,或者是否有一个总是比另一个人更好呢。

1 个答案:

答案 0 :(得分:0)

请注意,“ static”一词在C语言中还有其他含义。您似乎在询问声明具有恒定大小(例如int a[40])的数组与声明具有可变长度的数组之间的区别,例如int a[n],其中n在运行时已知,但通常在编译时未知。

在这种情况下,一般规则是在可能的情况下使用静态大小:

  • 在编译时知道确切大小时,或者
  • 知道上限并且使用上限不会浪费太多空间。

通常,使用静态大小会更有效,因为编译器拥有更多信息,因此有更多的优化机会。编译器在编译地址下标操作时,必须生成指令以计算地址。如果知道数组大小,则可能有机会在编译时执行某些计算(例如,对于int a[40]; a[13] = 2;,编译器可以从头算起a[13]为13•4 = 52字节a的值(当然假设为四字节int)或将数组大小作为立即操作数包含在指令中(这意味着它内置在代码中,而不必在代码中查找内存或在运行时获取内存。

如果编译器不知道数组大小,则必须在程序运行时生成完整的代码来计算地址。在当今典型的编程环境中,这通常不是很大的代价,但这可能是一个考虑因素。

此外,如果数组具有静态大小,则它可以是外部对象(在任何函数外部定义)。外部对象具有静态存储期限,这意味着它们在运行程序的生命周期内存在。 (在这里,“静态”在C语言中使用,不同于固定大小。)当编译器知道数组的大小时,它可以计划程序启动时为其提供的存储。这使具有静态大小的阵列具有静态存储持续时间。对于具有动态大小的数组,编译器通常无法为其规划所需的存储,因此它们不能是外部对象。