为什么全局变量和静态变量初始化为默认值?

时间:2010-01-19 06:15:51

标签: c++ c static global-variables

在C / C ++中,为什么全局变量和静态变量初始化为默认值?

为什么不把它留下垃圾值?有什么特别的吗? 原因是什么?

5 个答案:

答案 0 :(得分:69)

  1. 安全性 :单独留下内存会泄露其他进程或内核的信息。

  2. 效率 :在初始化为某些内容之前,这些值是无用的,并且在具有展开循环的块中将它们归零会更有效。当系统空闲时,操作系统甚至可以零空闲列表页面,而不是当某个客户端或用户正在等待程序启动时。

  3. 重复性 :单独保留这些值会使程序行为不可重复,使得很难找到错误。

  4. 优雅 :如果程序可以从0开始,而不必使用默认的初始化程序来混淆代码,那就更清晰了。

  5. 有人可能会想知道为什么auto存储类 启动为垃圾。答案是双重的:

      从某种意义上说,
    1. 没有,。每个级别的第一个堆栈帧页面(即,添加到堆栈的每个新页面)确实接收零值。同一堆栈级别的后续函数实例看到的“垃圾”或“未初始化”值实际上是您自己的程序及其库的其他方法实例留下的先前值。

    2. 可能存在与将auto(函数本地)初始化为任何内容相关联的二次(或其他)运行时性能损失。例如,在任何给定的调用中,函数可能不会使用任何或所有大型数组,并且可以调用数千或数百万次。静态和全局变量OTOH的初始化只需要发生一次。

答案 1 :(得分:24)

因为在OS的适当配合下,可以实现0初始化静态和全局变量而无需运行时开销。

答案 2 :(得分:17)

第6.7.8节C99标准的初始化(n1256)回答了这个问题:

如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果没有显式初始化具有静态存储持续时间的对象,则:

- 如果它有指针类型,则将其初始化为空指针;

- 如果它有算术类型,则初始化为(正或无符号)零;

- 如果是聚合,则根据这些规则初始化(递归)每个成员;

- 如果是联合,则根据这些规则初始化(递归)第一个命名成员。

答案 3 :(得分:6)

想想看,在静态领域,你无法总是确定某些东西确实被初始化,或者主要已经开始了。还有一个静态初始化和一个动态初始化阶段,静态初始阶段就在顺序重要的动态阶段之后。

如果你没有将静态归零,那么你将完全无法在这个阶段判断是否有任何东西被初始化,简而言之,C ++世界会分开并且基本的东西如单身(或任何类型)动态静态init)将简单地停止工作。

这些要点的答案是热情但有点傻。这些都可以适用于非静态分配但是没有做到(好的,有时但通常不会)。

答案 4 :(得分:2)

  

在C中,没有显式初始值设定项的静态分配对象初始化为零(对于算术类型)或空指针(对于指针类型)。 C的实现通常使用仅由零值位组成的位模式表示零值和空指针值(尽管C标准不要求这样做)。 因此,bss部分通常包括在文件范围(即,在任何函数之外)声明的所有未初始化的变量以及使用static关键字声明的未初始化的局部变量。

来源:Wikipedia