在C / C ++,为什么全局和初始化为默认值静态变量?
为什么不只是垃圾值离开吗? 是否对此有任何特殊的原因?
在C / C ++,为什么全局和初始化为默认值静态变量?
为什么不只是垃圾值离开吗? 是否对此有任何特殊的原因?
安全性 :只留下内存泄漏会从其他进程或内核信息。
效率 :值是没用的,直到初始化的东西,这是更有效地与展开的循环块零它们。 操作系统甚至可以为零,当系统处于空闲状态,而不是当一些客户或用户等待节目开始空闲列表页面。
重现 :离开值单独会使程序的行为不可重复,使错误真的很难找到。
雅 :它是清洁,如果程序可以从0开始,而无需使用默认初始化杂乱的代码。
那么有人可能会问,为什么auto
存储类并启动垃圾。 答案是两个方面:
这不,在一定意义上。 在每个级别的非常第一堆栈帧页(即,添加到堆栈每一个新的页面)不接收零个值。 该“垃圾”或“未初始化”值,在相同的堆栈层次后续功能情况看真的是您自己的程序和库的其他方法情况下离开了以前的值。
有可能是与初始化相关的二次(或其他) 的运行时性能损失 auto
(功能本地人)到任何东西。 一个功能可能无法使用任何或所有大阵,说,在任何给定的呼叫,并且它可以被调用的时间数以百万计。 静态和全局变量的初始化,OTOH,只需要发生一次。
因为与操作系统的正常合作,0初始化静态和全局可以在没有运行时开销来实现。
第6.7.8 C99标准(n1256)的初始化回答了这个问题:
如果具有自动存储持续时间的对象没有被明确初始化,它的值是不确定的。 如果具有静态存储持续时间的对象没有初始化,则:
- 如果它有指针类型,它被初始化为空指针;
- 如果它有算术类型,它被初始化为(正或无符号的)零;
- 如果它是一个聚集体,每一个成员被初始化(递归地)根据这些规则;
- 如果它是联合,第一个命名构件(递归地)根据这些规则进行初始化。
想想看,在静态的境界,你不能总是肯定地告诉的东西确实是初始化,或者主已经开始。 还有一个静态初始化和动态初始化阶段,动态之一,为了事宜后,静态的优先权。
如果你没有归零静态的,那么你将完全无法在这个阶段一定要告诉如果有什么被初始化AT ALL和短的C ++世界就会飞散开和基本的东西,像单身(或任何形式的动态静态的INIT)将简单的停止工作。
与bulletpoints答案是热情,但有点傻。 这些可能都适用于非静态分配但不这样做(当然,有时,但并不总是)。
在C中,没有显式的初始化静态分配的对象被初始化为零(用于算术类型)或空指针(用于指针类型)。 的C实现通常表示使用仅由零值比特(尽管这不是由C标准要求)的位模式的零值和空指针值。 因此,bss段通常包括在文件范围内与所述静态关键字声明(即,任何函数的外部)以及未初始化局部变量声明的所有未初始化的变量。
资料来源: 维基百科