C++ 静态为什么只初始化一次
int fun(){ static int i=0; i++; return i;}int main(){ int n=0; cout<<fun()<<endl; cout<<fun()<<endl;}bool g_bInit = false;int fun(){ static int i; if (!g_bInit) { i=0; g_bInit = true; } i++; return i;}
[解决办法]
楼主,静态变量他是和全局的变量一样都是存在全局区域,但是他和全局数据不同的是他的访问区域只局限于那个作用域就比如在你这个函数,里面,但是在外面是访问不了的。
说到这里楼主应该知道静态变量的生命周期应该是和全局变量一样的,是和程序一样的,那么他就不会每次都初始化,只说一叫初始化就不会是发生多次的。
最后在罗嗦一句就是,这个初始化是发生在程序第一次执行到这个静态变量的作用局,他才会有且仅有地初始化依次下次再进入这个位置就会跳过这个区域。
[解决办法]
操作系统在加载程序时会根据程序中的声明部分为程序分配内存空间(这部分数据是由编译器生成的)。
程序所支配的内存空间分为两大部分:静态区域和动态区域(至于为什么这样区分涉及到硬件知识,建议LZ不要深究):动态区域用于存储经常会变动的数据(动态区域又分为两大部分:栈和堆,关于这两个部分大家应该都很熟悉了);静态区域(Java里称为永久区域)用于存储不会经常变化的数据,例如程序的指令代码(C/C++里就是各个函数编译后得到的代码)、用户类型(结构体、类)的声明代码、全局变量、静态变量……
PS:有些例子提到用静态变量来做递归的计数器,那只是为了说明静态变量的特性。实际上不推荐这种用法,因为这样会对程序性能造成轻微的影响。
静态区域内的数据会在程序加载时进行初始化,生存期为程序运行的全部时间。
另外,纠正LZ的一个误解:任何变量都只进行一次初始化。局部变量在程序块结束时生存期就结束了,下次再调用这个程序块时从原理上说声明的是另一个变量了(分配到的地址也不一定一样)。
PS:在不同编译器的不同编译情况时,实际的内存分区可能不同。例如TC的Small模式下堆和栈区是重合的,而Tiny模式下连静态区域和动态区域都是重合的。