由于默认情况下全局变量和静态变量初始化为0,为什么局部变量默认也没有初始化为0?
答案 0 :(得分:10)
因为这样的零初始化需要执行时间。它会使你的程序显着变慢。每次调用函数时,程序都必须执行无意义的开销代码,将代码设置为零。
静态变量在程序的整个生命周期中都会持续存在,所以你可以让luxuary对它们进行零初始化,因为它们只被初始化一次。本地人在运行时初始化。
在实时系统中启用编译器选项并不常见,该编译器选项也会停止静态存储对象的零初始化。这样的选项使程序不标准,但也使它更快启动。
答案 1 :(得分:9)
这是因为全局变量和静态变量存在于不同的内存区域而不是局部变量。
未初始化的静态和全局变量存在于.bss段中,该段是程序启动前保证在程序启动时初始化为零的内存区域。
显式初始化静态和全局变量是实际应用程序文件的一部分,它们的值在编译时确定并与应用程序一起加载到内存中
局部变量是在运行时通过增加堆栈动态生成的。如果你的堆栈在一个包含垃圾的内存区域上增长,那么你的未初始化的局部变量将包含垃圾(垃圾输入,垃圾输出)。
答案 2 :(得分:5)
因为这需要时间,而且并不总是需要它们为零。
局部变量的分配(通常在CPU的硬件堆栈上)非常快,远小于每个变量一个指令,并且基本上与变量的大小无关。
因此,与分配相比,任何初始化代码(通常不独立于变量的大小)都会增加相对大量的开销,并且由于您无法确定是否需要初始化,因此在优化性能时会非常具有破坏性。
全局/静态变量是不同的,它们通常存在于程序加载器的一部分中,无论如何都被程序加载器设置为0,所以你可以“免费”获得它。
答案 3 :(得分:0)
全局变量和静态变量存储在数据段中[未初始化数据段中的数据在程序开始执行之前由内核初始化为算术0],而局部变量存储在调用堆栈中。
答案 4 :(得分:0)
主要是历史性的。当C被定义时,返回零 静态变量的初始化由。自动处理 操作系统,无论如何都会发生,其中零初始化 局部变量需要运行时。第一个仍然是 今天在许多系统(包括所有Unix和Windows)上都是如此。 然而,第二个问题远不是一个问题;大多数编译器会 在大多数情况下检测多余的初始化,并跳过它, 在编译器不能这样做的情况下,其余部分 代码将足够复杂,所需的时间 初始化是不可测量的。你还可以 构建特殊情况,但情况并非如此 他们当然非常罕见。但是,原来的C是 如此指定,并没有任何委员会审查过 从那以后的问题。
答案 5 :(得分:0)
显式初始化的全局或静态变量将存储在.data段(初始化数据)中,未初始化的全局或静态变量存储在.bss(未初始化的数据)中。
此.bss未存储在已编译的.obj文件中,因为没有可用于这些变量的数据(请记住,您尚未使用任何特定数据对其进行初始化)。
现在,当操作系统加载exe时,它只是查看.bss段的大小,分配那么多内存,并为你做零初始化(exec
)。这就是为什么有必要将.bss段初始化为零。
未初始化局部变量,因为不需要初始化它们。它们存储在堆栈级别,因此加载exe将自动加载局部变量所需的内存量。那么,为什么要对局部变量进行额外的初始化并使我们的程序变慢。
答案 6 :(得分:0)
假设你需要调用一个函数100次,如果有一个局部变量,并假设它是 每次初始化为0 ... oops会有额外的开销和浪费时间。 另一方面,全局变量只初始化一次。因此我们可以将其默认初始值设为0。