【发布时间】:2019-07-03 13:58:53
【问题描述】:
为什么是值
int array[10];
在函数中声明时未定义,在声明为static时为0-initialized?
我一直在阅读this question的答案,很明显
[函数中的表达式
int array[10];]的意思是:在不做任何初始化的情况下获得10-int-size内存区域的所有权。如果数组在函数中被声明为全局数组或静态数组,则所有元素如果尚未初始化,则将被初始化为零。
问题:为什么会有这种行为?编译器程序员是否决定(出于特定原因)?使用的特定编译器可以做不同的事情吗?
我问这个问题的原因:我问这个问题是因为我想让我的代码在架构/编译器之间移植。为了确保它,我知道我总是可以初始化声明的数组。但这意味着我只会为这次手术浪费宝贵的时间。那么,哪个是正确的决定?
【问题讨论】:
-
如果数组是静态/全局的 - 那么它是零初始化的。如果它是本地/自动的 - 那么它不会被初始化。因为标准是这样说的。
-
"问题:为什么会有这种行为?"不初始化局部变量的理由是执行速度。在使用它们之前将所有变量设置为零会产生执行开销。这与 malloc 不将内存初始化为零的原因相同。
-
我不认为这是一项要求,但大多数编译器会将静态数据放入
.bss数据段中,当应用程序加载到内存中时,该数据段将初始化为零。 -
为什么是为了速度。静态数据通常都聚集在一起并在一个大的 .bss 块中声明。大多数对象加载器都有一种在程序启动时将大块内存归零的有效方法。另一方面,如果您不需要,每次输入函数时将每个数组分配归零会花费一些处理时间。
-
@Leos313 不。静态数据也必须初始化,但它是由
main之前发生的运行时库/启动代码完成的。但它只发生一次,而不是每次程序运行可以多次执行的函数。