全局变量的初始化和函数内部静态变量的初始化一样吗
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:
- 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:
- when a variable with automatic, static, or thread-local storage
duration is declared with no initializer;
正如 molbdnilo 在评论中所说,如果您只对标准声明的行为感兴趣,则应完全避免在此处考虑二进制文件、内核和段。
我正在尝试找出 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:
- 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:
- when a variable with automatic, static, or thread-local storage duration is declared with no initializer;
正如 molbdnilo 在评论中所说,如果您只对标准声明的行为感兴趣,则应完全避免在此处考虑二进制文件、内核和段。