在C语言中,如果未初始化,则具有自动存储的对象将具有不确定的值,而静态对象则不会。从标准:
如果具有自动存储期限的对象未明确初始化,则其值不确定。如果未明确初始化具有静态或线程存储持续时间的对象,则:
- 如果具有指针类型,则将其初始化为空指针;
- 如果具有算术类型,则将其初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则(递归)初始化每个成员,并将任何填充初始化为零位;
- 如果是联合,则根据这些规则(递归地)初始化第一个命名成员,并将任何填充初始化为零位;
我们都知道C是一种非常宽容的语言,它将所有的责任都交给了程序员,所以让我想知道为什么他们决定将静态对象初始化为零。我还想知道,为什么并且仅当至少手动初始化了一个元素时,自动数组才完全初始化为零。但是令我最好奇的是,为什么他们要么选择要么一无所有,要么一无所有。
这背后的原理是什么?
一句话:效率。
对于静态对象,它们具有完整的程序生命周期,因此,它们的初始值是在编译时设置的,这意味着没有运行时成本。对于自动对象,它们每次进入作用域时都需要初始化。因此,除非对其进行显式初始化,否则这样做将浪费处理器周期。
关于数组和结构,对象要么被初始化,要么未被初始化。因此,如果至少一部分被显式初始化,其余的也必须被初始化。据推测,如果不需要跟踪任何部分初始化的变量,这将使编译器更容易围绕未初始化的变量执行优化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句