静态变量初始化?

Sac*_*iya 10 c c++ java static-initialization

我想知道为什么C,C++和Java中的静态变量默认初零归零?为什么局部变量不是这样呢?

Paw*_*dan 20

为什么静态变量是确定性初始化而局部变量不是?

了解如何实现静态变量.它们的内存在链接时分配,并且它们的初始值也在链接时提供.没有运行时开销.

另一方面,局部变量的内存在运行时分配.堆栈必须增长.你不知道之前有什么.如果需要,可以清除该内存(零),但这会导致运行时开销.C++哲学是"你不为你不使用的东西买单",所以默认情况下它不会将内存归零.

好的,但为什么静态变量初始化为零,而不是其他值?

好吧,你通常想用这个变量做点什么.但那你怎么知道它是否已被初始化?您可以创建一个静态布尔变量.但是它也必须可靠地初始化为某种东西(最好是假的).指针怎么样?你宁愿把它初始化为NULL而不是一些随机垃圾.结构/记录怎么样?它里面还有一些其他的数据成员.将所有这些值初始化为默认值是有意义的.但为简单起见,如果使用"初始化为0"策略,则不必检查单个成员并检查其类型.您只需将整个内存区域初始化为0即可.

这不是真正的技术要求.如果默认值不是0,但仍然是确定性的,那么初始化的语义仍然可以被认为是合理的.但那么,这个价值应该是什么?你可以很容易地解释为什么使用0(虽然它确实听起来有点武断),但是解释-1或1024似乎更难(尤其是变量可能不足以容纳该值,等等).

并且您始终可以显式初始化变量.

并且您始终拥有C++标准的第8.5.6段,其中说"静态存储持续时间的每个对象都应在程序启动时进行零初始化".

有关详细信息,请参阅以下其他问题:


And*_*nck 5

C++ 标准的第 8.5.6 段指出:

“每个静态存储期的对象都应在程序启动时进行零初始化”

(标准也说局部变量的初始化是undefined)

至于为什么,标准没有说明;) 一种猜测是它很容易实现,没有任何额外的缺点。