Xin*_*nus 61 c c++ static global-variables
在C/C++中,为什么全局变量和静态变量初始化为默认值?
为什么不留下垃圾值呢?这有什么特别的原因吗?
Dig*_*oss 68
安全性:单独留下内存会泄漏来自其他进程或内核的信息.
效率:在初始化为某些内容之前,这些值是无用的,并且在具有展开循环的块中将它们归零会更有效.当系统处于空闲状态时,操作系统甚至可以将零空闲页面置零,而不是在某个客户端或用户等待程序启动时.
再现性:单独保留值会使程序行为不可重复,使得很难找到错误.
优雅:如果程序可以从0开始而不必使用默认初始化程序混乱代码,那就更清晰了.
然后人们可能想知道为什么auto存储类确实以垃圾为起点.答案是双重的:
从某种意义上说,它没有.每个级别的第一个堆栈帧页面(即,添加到堆栈的每个新页面)确实接收零值.同一堆栈级别的后续函数实例看到的"垃圾"或"未初始化"值实际上是您自己的程序及其库的其他方法实例留下的先前值.
可能存在与初始化(函数本地)到任何事物相关的二次(或任何)运行时性能损失auto.例如,在任何给定的调用中,函数可能不会使用任何或所有大型数组,并且可以调用数千或数百万次.静态和全局变量OTOH的初始化只需要发生一次.
Jin*_*Yao 17
第6.7.8节C99标准的初始化(n1256)回答了这个问题:
如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.
想一想,在静态领域,你无法确定某些东西确实被初始化,或者主要已经开始了.还有一个静态初始化和一个动态初始化阶段,静态初始阶段就在顺序重要的动态阶段之后.
如果你没有从静态中归零那么你就完全无法在这个阶段告诉你是否有任何事情在全部被初始化,简而言之,C++世界将会分开并且基本的东西如单身(或任何类型的动态静态) init)简单地停止工作.
有关要点的答案很热情,但有点傻.这些都可以适用于非静态分配,但是没有做到(好的,有时但不常见).