我很好奇函数中静态变量的底层实现。
如果我声明一个基本类型(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 块?
static bool initialized = 0;
if (!initialized)
{
// construct myVar
initialized = 1;
}
原文由 e.James 发布,翻译遵循 CC BY-SA 4.0 许可协议
在我看到的编译器输出中,函数局部静态变量完全按照您的想象进行初始化。
请注意,通常这 不是 以线程安全的方式完成的。因此,如果您有可能从多个线程调用的带有静态局部变量的函数,您应该考虑到这一点。在调用任何其他函数之前在主线程中调用一次函数通常可以解决问题。
我应该补充一点,如果本地静态的初始化是通过像您的示例中那样的简单常量,编译器不需要经过这些回转 - 它可以只初始化图像中或之前的变量
main()
就像一个常规的静态初始化(因为你的程序无法区分)。但是,如果您使用函数的返回值对其进行初始化,那么编译器几乎必须测试一个标志,该标志指示是否已完成初始化或类似的操作。