c++ 程序启动时静态局部变量的初始化

pxy2qtax  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(147)

cppreference声明:
在块作用域中声明的变量使用static或thread_local(C11起)说明符,具有static或thread(C11起)存储持续时间,但在控制第一次通过它们的声明时被初始化(除非它们的初始化是零或常量初始化,这可以在第一次进入块之前执行)。
我的问题是关于“除非”部分-你能给予静态局部变量为零和常量初始化的代码示例吗?类对象(例如MyClass obj;)可以为零或常量初始化吗?如果可以,这是否意味着它们的构造函数将在main()启动之前被调用?

wixjitnu

wixjitnu1#

你能给予静态局部变量初始化为零和常量的代码示例吗?
在下面给出的例子中,局部静态变量n满足常量初始化的两个条件,所以这里引用语句中的“unless”部分也成立。

int main()
{
     static const int i = 5; //both conditions for constant initialization are satisfied so that the "unless" part of your quoted statement also holds
}

变量或临时对象obj常量初始化的,如果

*或者它有一个初始化器,或者它的缺省初始化导致执行某些初始化,以及
*它的初始化全表达式是一个常量表达式,除了如果obj是一个对象,该全表达式也可以为obj及其子对象调用constexpr构造函数,即使这些对象是非文本类类型(C++11起)。

类对象(例如MyClass obj;)可以被零初始化或常量初始化吗?
类对象也可以被常量初始化。

struct Custom
{
    constexpr Custom()
    {
        
    }
};
int main()
{
     static constexpr Custom obj;//here also both conditions for constant initialization are satisfied
}

还要注意,初始化并不一定意味着必须使用构造函数。例如,在#include <string> std::string s; int main(){}中,s首先是零初始化,然后是默认初始化(使用默认ctor)。这意味着这里的第一个初始化步骤不使用任何ctor。

juzqafwq

juzqafwq2#

根据这个https://en.cppreference.com/w/cpp/language/zero_initialization
在任何其他初始化之前,对具有静态[...]存储持续时间且不受常量初始化影响的每个命名变量执行[...]零初始化。
所以在这种情况下

int main() {
    ...
    static MyClass a;
    ...
}

a的零初始化可以在main()开始之前执行,但是其构造函数将如预期的那样在main()内被调用。

相关问题