我是C语言的新手,我只是想知道是否存在这样一种情况,一个人比另一个人更受青睐,是否仅取决于一个人的偏好,或者是否有一个总是比另一个人更好呢。
答案 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语言中使用,不同于固定大小。)当编译器知道数组的大小时,它可以计划程序启动时为其提供的存储。这使具有静态大小的阵列具有静态存储持续时间。对于具有动态大小的数组,编译器通常无法为其规划所需的存储,因此它们不能是外部对象。