C++内存分为5个区域(堆栈全常代 ):
根据c/c++对象生命周期不同,c/c++的内存模型有三种不同的内存区域,即
而代码虽然占内存,但不属于c/c++内存模型的一部分
在linux系统中,程序在内存中的分布如下所示:
其中 :
text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系 统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
一个正在运行着的C编译程序占用的内存分为代码区、初始化数据区、未初始化数据区、堆区 和栈区5个部分。
(1)代码区(text segment)。代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需 要借助栈来实现。
代码区的指令中包括 *** 作码和要 *** 作的对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码中;如果是局部数据,将在栈区 分配空间,然后引用该数据地址;如果是BSS区和数据区,在代码中同样将引用该数据地址。
(2)全局初始化数据区/静态数据区(Data Segment)。只初始化一次。
(3)未初始化数据区(BSS)。在运行时改变其值。
(4)栈区(stack)。由编译器自动分配释放,存放函数的参数值、局部变量的值等。其 *** 作方式类似于数据结构中的栈。每当一个函数被调用,该函 数返回地址和一些关于调用的信息,比如某些寄存器的内容,被存储到栈区。然后这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,这就是C实现 函数递归调用御渣的方法。每执行一次递归函数调用,一个新的栈框架就会被使用,这样这个新实例栈里的变量就不会和该函数的另一个实例栈里面的变量混淆。
(5)堆区(heap)。用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS 回收。
之所以分成这么多个区域,主要基于以下考虑:
一个进程在运行过程中,代码是根据流程依次执行的,只需要访问一次,当然跳转和递归有可能使代码执行多次,而数据一般都需要访问多次,因此单独开辟 空间以方便访问和节约空间。
临时数据及需要再磨拆凳次使用的代码在运行时放入栈区中,生命周期短。
全局数据和静态数据有可能在整个程序执行过程中都需要访问,因此单独存储管理。
堆区由用户自由分配,以便管理。
下面通过一段简单的代码来查看C程序执行时的内瞎旅存分配情况。相关数据在运行时的位置如注释所述。
c/c++面试精选题前4篇 导读:
const关键字作用总结
volatile关键字的用法及意义
static关键字的作用
extern关键字的作用
堆栈是一样的。这些细节编程的人敏岁不用管。new出来的空间是自动清袜管理的,编桥正睁程者不用 *** 心。malloc是编程人自己直接管理空间的,你索要了空间,最后要归还。因为系统不知道你什么时候不需要你申请的空间了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)