void testFunc()
{
static int runCount = 0; // this only runs ONCE, even on
// subsequent calls to testFunc()!
cout << "Ran this function " << ++runCount << " times" << endl;
} // runCount stops being in scope, but does not die here
int main()
{
testFunc(); // says 1 time
testFunc(); // says 2 times!
}
C++ 局部静态初始化是线程安全的
对于基本数据类型而言,局部静态变量和全局变量一样都是在进入main之前初始化的,可以认为是线程安全的; 而对于自定义类型的局部静态变量(对象),编译器的做法是定义一个bool型的局部静态变量,初始化为false,然后在函数中进行判断,如果为假就进行对象的初始化操作,如果为真就直接返回对象,这样就不是线程安全的了,因为对象可能被初始化多次。可以做个测试:
1、基本数据类型
void fun(){
static int a = 0x123456;
cout << a << endl;
}
int b =0x111111;
int main(){
fun(); //在这里加断点:在内存中查看b的值,应该可以看到紧挨着就有a的值
return 0;
}
2、自定义类型
class A{
public:
A(){
cout << " A " <<endl;
}
};
void fun(){
static A a; // 在这里加断点,查看汇编代码,可以看到有一个比较命令,转换成伪代码应该是个if语句
}
int main(){
fun(); //在这里加断点,此时fun函数还没有执行,A a仍然没有初始化, 因为如果a初始化了,控制台就会有输出
}
原文链接: https://www.cnblogs.com/timy/p/8624313.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/270886
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!