全局变量的初始化与函数内部静态变量的初始化相同



我想弄清楚c++中所有不同类型的初始化。现在我正在阅读这个链接:https://en.cppreference.com/w/cpp/language/zero_initialization

在这个链接的例子中,我们有这样一段代码:
std::string s; // zero-initialized to indeterminate value
// then default-initialized to ""

根据我的理解,全局变量的初始化如下:

当我们编译代码时,s是零初始化的,它被放在二进制文件的.bss段。当我们运行二进制文件时(意味着内核开始将二进制文件加载到RAM中),s默认初始化为空字符串""。 现在,我们定义一个函数如下:
void func()
{
static std::string s;
}

如果我们第一次调用这个函数,s将被初始化,这是肯定的。但是它是否仍然用两个方法初始化:首先是零初始化,然后是默认初始化,就像第一个s一样?

顺便说一句,我在Ubuntu上工作,X86_64架构,编译器GCC 7.5。如果我的问题没有被c++标准化,你可以在评论中告诉我,我将结束这个问题。

但是它是否仍然用两个方法初始化:第一个0初始化,然后是默认初始化,就像第一个s?

假设"as-if"规则有效地强制编译器考虑该变量的存在,是的。标准:

在以下情况下进行零初始化:

  1. 对于每个具有静态或线程本地存储的命名变量不受常量初始化约束的持续时间其他初始化。

在三种情况下执行默认初始化:

  1. 当变量具有自动、静态或线程本地存储时声明duration时没有初始化式;

正如molbdnilo在注释中所说的,如果你只对标准声明的行为感兴趣,你应该避免在这里完全考虑二进制文件、内核和段。

最新更新