网站首页 > 文章精选 正文
然后我们再来看,c++的内存模型,中的四个区域.
代码区放函数体的二进制形式的代码,由操作系统管理
全局区,放全局变量和静态变量,以及常量
栈区,由编译器自动分配释放,存放函数的参数值,局部变量
堆区,是我们自己控制的,如果我们使用完资源,对象资源,但是忘记回收了,
那么程序结束的时候,操作系统会自动帮我们回收这些对象资源,
这点儿有点像java的垃圾回收机制.
可以看到内存模型的意义,内存划分的意义,为什么不把内存直接,全部一起使用呢?
因为划分了以后,可以明确每个内存模型中的意义,有可能,不同的内存模型,他们的内部存的内容
的生命周期也是不一样的.
然后我们再去看,有了exe程序,在点击了程序,但程序还没有跑起来之前,会有两个区域.
代码区,先去看这个代码区,他有两个特点,一个是共享.
为什么是共享的,因为比如有个exe,我们需要经常的用,需要开多个,
那么每点击开一个,他的这个程序的代码,对应的二进制,数据在内存中实际上是只存一份的.
点击多次,但运行的是同一份的二进制代码.
然后,还有代码区的内存的内容是只读的,
比如我们花钱购买的金币是不能被别人修改的,也就是说,我的程序的,二进制代码,是不能被别人修改的.
需要注意,我们在点击exe,真正启动之前,操作系统就会先把这个exe的,代码的二进制数据,存到代码区中去.
然后我们再去看全局区的内存模型,在
全局区中,主要存放的是,程序的全局变量和静态变量,全局区
还包含了一个常量区,常量区,还分为了字符串常量以及其他常量.
要注意,这个区域的数据在程序结束后是由操作系统释放的,不是我们控制的.
然后我们用代码去演示一下各种内存区域中的区别.
写在函数体内的变量叫做局部变量.
上面我们在main方法中,定义了一个a这个局部变量.
然后我们打印出,这两个局部变量的地址
可以看到a的地址是 12385260
b的地址是 12385248
可以看到他们的地址是挨着的. 局部变量是放到栈区的,我们说
然后我们再去看看全局变量,在类中声明的变量是全局变量.
然后打印全局变量的地址
可以看到全局变量和局部变量的地址,一比较可以看到
局部变量的地址是:16121XXX
全局变量的地址是:103383XX
这样看的话,局部变量和全局变量的存的内容的地址是不一样的.差别比较大对吧,所以
我们说局部变量放到栈区,全局变量放到全局区.两个不同的区对吧.
然后全局区除了放全局变量,还放静态变量,常量.
我们先去定义一下静态变量,static int s_a = 10;
这样加上static就是静态变量了.
可以看到全局变量的地址是:19497xx
静态变量的地址是:19497xx
可以看到全局变量和静态的变量放的内存中的位置,几乎是在一块的,都在全局区中.
然后字符串常量我们再去看看
可以看到字符串常量的地址是:17537XXX
静态变量的地址是:17547XXX
全局变量的地址是:17547XXX
局部变量是地址是:5240XXX
所以我们知道了,全局区中存放了,全局变量,静态变量,字符串常量,并且
全局变量和静态变量挨得比较近,字符串常量,稍微远一点.
局部变量不在全局区中.
全局变量和静态变量挨得很近
然后字符串变量,也在全局区中,但是可以看到稍微离得静态变量,全局变量远一点儿.
然后我们再来看一种,
const修饰的全局变量,以及const修饰的局部变量,他们的地址的区别.
定义一个const修饰的全局变量.
我们声明两个const修饰的全局变量.
也就是两个全局常量.
然后我们去打印这两个全局常量
可以看到这两个
全局常量的地址是:28558xxx
字符串常量的地址是:2857XXX
可以看到只要是常量,他们挨得就很近,
全局常量和字符串常量.的地址可以看到挨得挺近
然后我们在main方法中定义两个局部常量,可以看到
然后我们打印这两个局部常量
const int c_l_a =10;
可以看到局部常量的地址:5961XXX
而全局常量地址:1026XXX
字符串常量地址:1026XXX
静态变量的地址:1027XXX
全局变量的地址:1027XXX
局部变量的地址:5961XXX
只要是,带有局部的,局部变量,局部常量,他们都没有放在全局区
可以看到全局变量,静态变量,字符串常量,全局常量在全局区中.
上面是个总结.
猜你喜欢
- 2025-05-02 利用Axure+js创建可配置地图页面(axure做地图)
- 2025-05-02 JVM性能调优(1)——JVM内存模型和类加载运行机制
- 2025-05-02 C++变量作用域(c++变量的作用)
- 2025-05-02 成员变量、局部变量、静态变量(什么是成员变量和局部变量,以及它们的区别有哪些)
- 2025-05-02 C++|带析构语义的类的异常处理:抛出异常、栈展开、自动析构
- 2025-05-02 「设计模式」10分钟学懂UML类图(uml类图设计模式有哪些)
- 2025-05-02 罗克韦尔(AB)PLC讲解,用户自定义指令(AOI)详解
- 2025-05-02 内部疯传,22个必考C++面试知识点总结(附答案解析)
- 2025-05-02 从零开始学习C语言丨全局和局部的作用域、变量
- 2025-05-02 嵌入式C语言基础编程—5年程序员给你讲函数,你真的懂函数吗?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)