【问题标题】:Why are objects with automatic storage not zeroed when static objects are?为什么静态对象是自动存储的对象不归零?
【发布时间】:2020-02-12 17:05:44
【问题描述】:

在 C 中,具有自动存储功能的对象如果未初始化则具有不确定的值,而静态对象则没有。来自the standard

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

  • 如果有指针类型,则初始化为空指针;
  • 如果它具有算术类型,则将其初始化为(正或无符号)零;
  • 如果是聚合,则每个成员都根据这些规则进行初始化(递归),并且任何填充都初始化为零位;
  • 如果是联合,则根据这些规则(递归)初始化第一个命名成员,并将任何填充初始化为零位;

我们都知道 C 是一种非常无情的语言,它把所有的责任都交给了程序员,所以我有点想知道为什么他们决定零初始化静态对象。我还想知道为什么当且仅当至少一个元素被手动初始化时,自动数组才会完全零初始化。但最让我好奇的是,他们为什么不选择为所有事情或一事无成。

这背后的原理是什么?

【问题讨论】:

  • 我怀疑这可能归结为此类数据通常如何保留在程序的数据段中。
  • 其实是BSS segment
  • "把所有的responsibility 给程序员" --> 很好。

标签: c initialization storage-duration


【解决方案1】:

一句话:效率

对于静态对象,它们具有完整的程序生命周期,因此它们的初始值是在编译时设置的,这意味着没有运行时成本。对于自动对象,每次进入范围时都需要对其进行初始化。因此,除非它们被显式初始化,否则这样做会浪费处理器周期。

对于数组和结构,一个对象要么被初始化,要么未被初始化。因此,如果它的至少一部分被显式初始化,其余的也必须被初始化。据推测,如果编译器不需要跟踪任何部分初始化的内容,这可能使编译器更容易围绕未初始化的变量执行优化。

【讨论】:

  • 当然,初始化静态对象需要运行时成本。将内存设置为零或其他值不是免费的。它需要硬件的实际物理动作。 (不过,如果操作系统已经为安全/隐私保护执行此操作,则将其设置为零可能没有额外成本。)
猜你喜欢
  • 2018-06-05
  • 2016-05-08
  • 1970-01-01
  • 2011-06-30
  • 2017-07-19
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 2017-08-13
相关资源
最近更新 更多