程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

C++_程序内存模型_内存四区_代码区_全局区

balukai 2025-05-02 16:36:39 文章精选 6 ℃

然后我们再来看,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


只要是,带有局部的,局部变量,局部常量,他们都没有放在全局区

可以看到全局变量,静态变量,字符串常量,全局常量在全局区中.

上面是个总结.



























最近发表
标签列表