为什么具有自动存储的对象在静态对象时不归零?
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 是一种非常无情的语言,它把所有的责任都交给了程序员,所以这让我有点奇怪为什么他们决定零初始化静态对象。我还想知道为什么当且仅当至少一个元素被手动初始化时,自动数组才完全零初始化。但最让我好奇的是,为什么他们不选择要么什么都做要么什么都不做。
这背后的原理是什么?
一句话:效率.
对于静态对象,它们具有完整的程序生命周期,因此它们的初始值是在编译时设置的,这意味着没有运行时成本。对于自动对象,每次进入作用域时都需要对其进行初始化。因此,除非显式初始化它们,否则会浪费处理器周期。
关于数组和结构,一个对象要么被初始化,要么不被初始化。因此,如果它的至少一部分被显式初始化,则其余部分也必须被初始化。据推测,如果编译器不需要跟踪任何部分初始化的内容,这将使编译器更容易围绕未初始化的变量执行优化。
在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 是一种非常无情的语言,它把所有的责任都交给了程序员,所以这让我有点奇怪为什么他们决定零初始化静态对象。我还想知道为什么当且仅当至少一个元素被手动初始化时,自动数组才完全零初始化。但最让我好奇的是,为什么他们不选择要么什么都做要么什么都不做。
这背后的原理是什么?
一句话:效率.
对于静态对象,它们具有完整的程序生命周期,因此它们的初始值是在编译时设置的,这意味着没有运行时成本。对于自动对象,每次进入作用域时都需要对其进行初始化。因此,除非显式初始化它们,否则会浪费处理器周期。
关于数组和结构,一个对象要么被初始化,要么不被初始化。因此,如果它的至少一部分被显式初始化,则其余部分也必须被初始化。据推测,如果编译器不需要跟踪任何部分初始化的内容,这将使编译器更容易围绕未初始化的变量执行优化。