为什么具有自动存储的对象在静态对象时不归零?

Why are objects with automatic storage not zeroed when static objects are?

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

If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static or thread storage duration is not initialized explicitly, then:

  • if it has pointer type, it is initialized to a null pointer;
  • if it has arithmetic type, it is initialized to (positive or unsigned) zero;
  • if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;
  • if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;

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

这背后的原理是什么?

一句话:效率.

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

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