gpt4 book ai didi

c++ - 编译器如何实现静态变量初始化?

转载 作者:IT老高 更新时间:2023-10-28 21:51:37 27 4
gpt4 key购买 nike

我很好奇函数中静态变量的底层实现。

如果我声明一个基本类型(char、int、double 等)的静态变量,并给它一个初始值,我想编译器只是在程序一开始就设置了该变量的值在调用 main() 之前:

void SomeFunction();

int main(int argCount, char ** argList)
{
// at this point, the memory reserved for 'answer'
// already contains the value of 42
SomeFunction();
}

void SomeFunction()
{
static int answer = 42;
}

但是,如果静态变量是类的实例:

class MyClass
{
//...
};

void SomeFunction();

int main(int argCount, char ** argList)
{
SomeFunction();
}

void SomeFunction()
{
static MyClass myVar;
}

我知道在第一次调用该函数之前它不会被初始化。由于编译器无法知道函数何时第一次被调用,它是如何产生这种行为的?它本质上是在函数体中引入一个 if block 吗?

static bool initialized = 0;
if (!initialized)
{
// construct myVar
initialized = 1;
}

最佳答案

This question涵盖了类似的基础,但没有提到线程安全。无论如何,C++0x 将使函数静态初始化线程安全。

(参见 C++0x FCD , 6.7/4 关于函数静态:“如果控制在变量初始化时同时进入声明,则并发执行应等待初始化完成。”)

另一件没有提到的事情是函数静态在其构造的相反顺序被破坏,因此编译器维护一个析构函数列表以在关闭时调用(这可能与 atexit 使用的列表相同,也可能不同)。

关于c++ - 编译器如何实现静态变量初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/898432/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com