测试环境vs2013,vs2015及以上使用Tls来判断是否置标志位。
先看vs2013:
int foo1(int n)
{
static int g_n = n;
printf("%08x\r\n", g_n);
return g_n;
}
int main()
{
foo1(3);
foo1(20);
foo1(30);
}
输出:
观察内存:
前面是g_n的地址,后面是标志位,标志位为1,表示已初始化,0表示为初始化,只需要每次调用函数使标志位判断值变为0即可多次初始化
vs2015,__Init_thread_header之前修改标记位全0,_Init_thread_footer记录初始化次数