全局变量的初始化和函数内部静态变量的初始化一样吗

Is the initialization of global variable the same as the initialization of static variable inside a function

我正在尝试找出 C++ 中所有不同类型的初始化。现在我正在读这个 link:https://en.cppreference.com/w/cpp/language/zero_initialization

在这个link的例子中,我们有这样一段代码:

std::string s; // zero-initialized to indeterminate value
               // then default-initialized to ""

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

当我们编译代码时,s被零初始化,它被放在二进制文件的.bss段。当我们 运行 二进制文件时(意味着内核开始将二进制文件加载到 RAM 中), s 默认初始化为空字符串 "".

现在,我们定义一个函数如下:

void func()
{
    static std::string s;
}

如果我们第一次调用该函数,s会被初始化,这是肯定的。但是是不是还是用两种方式初始化:先零初始化,再默认初始化,就像第一个一样s?

顺便说一句,我正在使用编译器 GCC 7.5 开发 Ubuntu、X86_64 架构。 如果我的问题没有被 C++ 标准化,你可以在评论中告诉我,我会关闭这个问题。

But is it still initialized with two methods: first zero initialization, then default initialization, just like the first s?

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

Zero initialization is performed in the following situations:

  1. For every named variable with static or thread-local storage duration that is not subject to constant initialization, before any other initialization.

Default initialization is performed in three situations:

  1. when a variable with automatic, static, or thread-local storage duration is declared with no initializer;

正如 molbdnilo 在评论中所说,如果您只对标准声明的行为感兴趣,则应完全避免在此处考虑二进制文件、内核和段。