C++:全局变量和static变量初始化
(一)全局变量
全局变量、文件域中的静态变量、类中的成员静态变量在main函数执行前初始化;
局部变量中的静态变量在第一次调用时初始化。
C++保证,全局变量在main函数第一次使用它之前,就把它初始化好。(可以直接理解成在main函数执行前就初始化好)但这个初始化可细分为:编译时初始化和运行时初始化,即static initialization和dynamic initialization。
1.static initialization
静态初始化,是针对于那些简单的、c++内部定义的数据结构,如int,double,bool及数组结构的初始化,又可分为zero和const两种方式。
对于zero初始化,也就是我们没指定初值,编译器分配0值给它,编译时编译器将其分配在bss段,不占用rom空间;
BSS段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0,所以,未初始的全局变量在程序执行之前已经成0了。
而const初始化,也就是我们指定了初值,编译器将其分配在data段,占用rom空间。
数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
2.dynamic initialization
这种初始化针对的是需要调用构造函数才能完成的初始化。这种初始化会在main函数执行前,在运行时由运行时库调用相应的代码进行初始化。
另外,静态初始化先于动态初始化。因为静态初始化发生在编译时期,直接写进bss段和data段,在程序执行时直接加载;
而动态初始化则是在运行时期,由运行时库调用相应构造函数进行初始化,同样要写进bss段或data段。
(二)类的静态成员
C++规定,const的静态成员可以直接在类内进行初始化,而非const的静态成员需要在类外声明以初始化。
使用过类中的静态成员变量的伙伴都发现了,在类中定义的静态成员变量,还必须要在类外定义下才可以使用,否则会编译报错。
那么为什么会出现这种情况呢?
静态成员变量不属于任何一个对象,对象的数据中不应该包含静态成员的数据。所以在定义类的时候不会给静态变量分配内存只是声明,因此就要在其他地方分配即定义。
定义与声明的区别:
声明:只是向程序表面变量的类型和名字。
定义:为变量分配内存,也可以顺便初始化。程序中变量有且只有一个定义(更能说明为什么要在类外再定义下类的静态成员变量了)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了