static变量的生存期问题
static变量的生存期问题
目录
- static变量的生存期问题
- C
- C++
- 参考链接
最近要写一个单例类,简单复习下C++的基础知识。
static变量是指静态的变量,不管是在全局还是局部声明的静态变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到到程序结束。但是在C和C++中,其初始化时机又有区别,具体结论如下:
C
全局变量 | 文件域的静态变量 | 静态局部变量 | |
---|---|---|---|
初始化 | 编译期初始化 | 编译期初始化 | 编译期初始化 |
一些细节:
C语言的静态变量的初始值都是在编译完成后,就会保存在编译生成的可执行文件中。所以,初始值在编译时就要计算出来,因此C语言之中无法使用变量对静态变量进行初始化,即以下写法是无法编译通过的:
int a=10; int b=a; int main(){}
C++
全局变量 | 文件域的静态变量 | 类的静态成员变量 | 静态局部变量 | |
---|---|---|---|---|
初始化 | main执行前 | main执行前 | main执行前 | 首次执行相关代码时初始化 |
一些细节:
上表对C++的内建类型和自定义类型均适用
C++中,静态成员属于类作用域,但不属于类对象,它的生命周期和普通的静态变量一样,存在于整个程序运行期间。所以不能在类的构造函数中进行初始化
类的成员函数中定义的静态局部变量,该类的所有对象在调用这个成员函数时将共享这个变量
main执行前是什么意思?到底是编译时还是运行时呢?这里引用一下C++标准(C++11 N3690 3.6.2):
全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;静态局部变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象
那什么是静态初始化呢?继续来看C++标准:
从语言的层面来说,全局变量的初始化可以划分为以下两个阶段:
static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero initialization 和 const initialization,静态初始化在程序加载的过程中完成,对简单类型(内建类型,POD等)来说,从具体实现上看,zero initialization 的变量会被保存在 bss 段,const initialization 的变量则放在 data 段内,程序加载即可完成初始化,这和 c 语言里的全局变量初始化基本是一致的。
dynamic initialization:动态初始化主要是指需要经过函数调用才能完成的初始化,比如说:int a = foo(),或者是复杂类型(类)的初始化(需要调用构造函数)等。这些变量的初始化会在 main 函数执行前由运行时调用相应的代码从而得以进行(静态局部变量除外)
根据这段描述,结合我实验的结果来看,对于内建类型,且在代码中已经手动初始化的,则该变量及其初始化值会被保存在可执行程序的data段,在运行时对其做const initialization;未手动初始化的,则该变量会被放在可执行程序的bss段,在运行时对其做zero initialization。对于自定义类型,则变量都是放在bss段,并且在运行时做动态初始化。总结如下:
手动初始化 未手动初始化 内建类型 data段,const initialization bss段,zero initialization 自定义类型 bss段,动态初始化 bss段,动态初始化 C++中可以使用变量对静态变量进行初始化
静态变量的销毁是通过
atexit()
来管理的,在程序结束,按照构造顺序反方向进行逐个析构(对于同一个编译单元内的静态变量,构造顺序和声明顺序是一致的;不同编译单元的,构造顺序是不定的)。
参考链接
https://www.runoob.com/w3cnote/cpp-static-usage.html
https://blog.csdn.net/hueru/article/details/89504059
https://www.cnblogs.com/catch/p/4314256.html
https://zhuanlan.zhihu.com/p/28659560
static变量的生存期问题相关推荐
- (转)static 变量
一. static 变量 static变量大致分为三种用法 1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期. 2. 用于全局变量,主要作用是限制此全局变量被其他 ...
- 变量的生存期和存储分配
1.变量的生存期 变量是内存空间的一种抽象,程序中定义的每个变量在运行时都有与之对应的内存空间. C++把变量占有的内存空间的时间段称为生存期,分为三类:静态生存期.动态生存期.自动生存期. 全局变量 ...
- static变量 static函数
首先要明白c语言的存储空间 转自:http://www.52rd.com/blog/Detail_RD.Blog_imjacob_5297.html 一.c程序存储空间布局 C程序一直由下列部分组成: ...
- c语言中static变量
c语言中static变量 2009-06-30 20:33:24| 分类:默认分类 | 标签:|字号大中小 订阅 static静态变量声明符. 在声明它的程序块,子程序块或函数内部有效,值保持,在 ...
- static变量和static函数的用法摘抄
一. static 变量 static变量大致分为三种用法 1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期. 2. 用于全局变量,主要作用是限制此全局变量被其他 ...
- c语言中static 变量
1. static 变量 静态变量的类型 说明符是static. 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量. 例如外部变量虽属于静态 存储方式,但不一定是静态变量, ...
- 变量的生存期与存储类型
变量的生存期与存储类型 1.变量的生存期 2.变量的存储类型 [1]自动变量 [2]外部变量 [3]静态变量 内部静态变量 外部静态变量 [4]寄存器变量 附:总结表 1.变量的生存期 所谓变量的生存 ...
- C++ 变量的生存期
变量的生存期是指其在程序运行时占用内存空间的时间段. 1. 静态生存期 从程序开始执行时分配到程序结束时收回. 如:全局变量 2. 自动生存期 从程序执行到定义它们的复合语句时分配到复合语句执行完毕时 ...
- python变量作用域和生存期_变量的生存期和作用域
变量的生存期和作用域是个很基础但又很重要的问题,所以我打算写几百字重温一下. 变量的生存期是指变量在什么时间段存在. 变量的作用域是指变量在哪些代码块中能够被访问. 一般来说变量生存期包含作用域.即在 ...
最新文章
- 如何高性价比地构建GPU环境,实现GPU自由?
- mmap映射大于4g的文件_iOS文件内存映射——MMAP
- mysql驱动不支持批处理_ADO.NET 中可以发送包含多个SQL语句的批处理脚本到SQL Server,但是用MySQL的ODBC驱动不行...
- sketch生成android代码,java – 从Android Processing Sketch保存图像
- 【luogu 1024 一元三次方程求解】二分思想
- openresty 搭建
- 过滤器如何配置(javax.servlet.Filter)?
- GBASE数据库安装手册中的一点命令
- 记一次PLC和脉冲型伺服电机的接线方法_20210915
- android opengl滤镜,Android OpenGL ES滤镜开发设计
- VS+Qt手动生成moc文件
- PyTorch - GAN与WGAN及其实战
- 【vue】仿淘宝商品详情---实现滚动显隐标签页锚点导航
- 阿里云下部署es单机
- 位运算 - 位运算基本操作
- 第二章 z变换之四 、序列的z变换与连续时间信号的Laplace变换、Fourier变换的关系
- 重新认识史蒂夫·乔布斯
- 主攻文推荐攻守都有系统_【图片】【推文】一些喜欢的主攻文_主攻文吧_百度贴吧...
- Final Report
- 数据库设计——医药销售管理系统