当前位置:网站首页>全局变量和静态变量的初始化
全局变量和静态变量的初始化
2022-06-29 18:39:00 【一只嵌入式爱好者】
全局变量和静态变量的初始化
全局变量、static变量初始化时间
静态局部变量
首先,静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。
在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。
而在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存。所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量对静态局部变量进行初始化的。
全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。
全局变量
根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量的初始化可以划分为以下两个阶段(c++11 N3690 3.6.2):
不要写出和编译顺序相关的程序
对于不同编译单位的全局变量,其初始化的顺序没有任何的保证,因此对不同编译单位里的全局变量,在它们的初始化顺序之间建立依赖性都是不明智的。此外也没办法捕捉到全局变量初始化抛出的异常,一般来说要减少全局变量的使用,特别是限制那些要求复杂初始化的全局变量。so:
1、尽量不用全局变量
2、用静态变量,通过访问器进行访问
例如:全局变量
int a = 5;
int b = a;
如果a,和b定义在同一个文件里,那没什么问题,结果b等于5。如果a和b定义在不同文件里,就不能保证b也等于5,也就是说不能保证a先初始化。事实上,除了在同一个文件定义的全局对象的初始化是按照定义次序来进行的之外,其他全局或静态变量之间的初始化次序没有任何保障。解决这种问题的方法是不直接使用全局变量,而改用一个包装函数来访问,例如
int get_a()
{
static int a = 5;
return a;
}
int get_b()
{
static int b = get_a();
return b;
}
这样的话,无论get_a和get_b是否定义在同一个文件中,get_b总是能够返回正确的结果,原因在于,函数内部的静态变量是在第一次访问的时候来初始化。
任何时候,如果在不同的被编译单元中定义了"非局部静态对象",并且这些对象的正确行为依赖于它们被初始化的某一特定顺序,就会产生问题。你绝对无法控制不同被编译单元中非局部静态对象的初始化顺序。对于函数中的静态对象(即"局部"静态对象)它们在函数调用过程中初次碰到对象的定义时被初始化…
总结
1、静态变量的初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。
2、静态变量只初始化一次,但可以通过赋值的方式多次修改静态变量的值。
3、全局变量和静态变量 在进入 main 前被初始化
边栏推荐
- selenium的跨浏览器测试
- The table ‘table_name‘ is full 异常排查及解决方案
- 细说GaussDB(DWS)复杂多样的资源负载管理手段
- AI场景存储优化:云知声超算平台基于 JuiceFS 的存储实践
- CentOS 7.5 install MySQL 8.0.27---yum
- Interview question 10.10 Rank of digital stream
- unittest单元测试框架
- Unittest unit test framework
- 求职大厂被拒?腾讯高手总结了11条被拒的原因!
- AMAZING PANDAVERSE:META”无国界,来2.0新征程激活时髦属性
猜你喜欢

从CIO到顾问:IT领导者的转型之路

Leetcode 984. String without AAA or BBB (thought of netizens)

企业数字化转型的点、线、面、体!

如何将OAK相机当做网络摄像头使用?

Anfulai embedded weekly report no. 271: June 20, 2022 to June 26, 2022
![报错[warning] Neural network inference was performed on socket ‘RGB’, depth frame is aligned to socket](/img/8a/ebad75daa581e22d50dddde49e1fac.jpg)
报错[warning] Neural network inference was performed on socket ‘RGB’, depth frame is aligned to socket

Notes on spintronics - zhangshufeng

Sword finger offer 34 Path DFS method for binary tree neutralization

75.二叉搜索树额最近公共祖先

Apache inlong million billion level data stream processing
随机推荐
Seven cattle image access parameters (thumbnails are small in size to avoid wasting traffic)
Advanced features of selenium webdriver
为什么信息化 ≠ 数字化?终于有人讲明白了
garbage collector
2. how to install MySQL database in Galaxy Kirin offline mode
Unittest unit test framework
selenium的跨浏览器测试
The table ‘table_name‘ is full 异常排查及解决方案
The developer task center is online! Thousands of yuan of gifts!
MySQL enterprise development specification
Cannot retrieve repository metadata processing records
Dragon canvas animation
Sword finger offer 34 Path DFS method for binary tree neutralization
PostGIS generate graphic cut
The 8th "Internet +" competition - cloud native track invites you to challenge
Goldfish rhca memoirs: do447 build advanced job workflow -- create workflow job template and start workflow job
移动端测试
Deep learning --- the weight of the three good students' scores (2)
Interview question 10.10 Rank of digital stream
Cannot retrieve repository metadata 处理记录