三种内存分配模式

原创 2006年06月23日 20:32:00

系统为进程分配数据空间有三种形式。

静态分配

整块静态分配空间,包括其中的所有数据实体,都是在进程创建时由系统一次性分配的(同时为UNIX称为Text的代码分配空间)。这块空间在进程运行期间保持不变。

初始化的和未初始化的实体分别放在初始化数据段和未初始化数据段(BSS)。后者和前者不同,在.o文件a.out文件里都不存在(只有构架信息),在进程的虚拟空间里才展开。

extern变量和static变量采用静态分配。

在进程创建时做静态分配,分配正文(text)段、数据段和栈空间。

正文和初始化数据是按a.out照样复制过来;未初始化数据按构架信息展开,填以0或空;栈空间的大小由链接器开关(具体哪个开关忘了)决定。

栈分配

整个栈空间已在进程创建时分配好。栈指针SP的初值的设定,确定了栈空间的大小。链接器的某个开关可以设定栈空间的大小。在进程运行期间,栈空间的大小不变。但是,在进程刚启动时,栈空间是空的,里面没有实体。在进程运行期间,对具体实体的栈分配是进程自行生成(压栈)和释放(弹出)实体,系统并不参与。

auto变量和函数参数采用栈分配。

只要压入的实体的总长度不超过栈空间尺寸,栈分配就与系统无关。如果超过了,就会引发栈溢出错误。

堆分配

当进程需要生成实体时,向系统申请分配空间;不再需要该实体时,可以向系统申请回收这块空间。

堆分配使用特定的函数(如malloc()等)或操作符(new)。所生成的实体都是匿名的,只能通过指针去访问。

对实体来说,栈分配和堆分配都是动态分配:实体都是在进程运行中生成和消失。而静态分配的所有实体都是在进程创建时全部分配好的,在运行中一直存在。

同为动态分配,栈分配与堆分配是很不相同的。前者是在进程创建时由系统分配整块栈空间,以后实体通过压栈的方式产生,并通过弹出的方式取消。不管是否产生实体,产生多少实体,栈空间总是保持原来的大小。后者并没有预设的空间,当需要产生实体时,才向系统申请正好能容纳这个实体的空间。当不再需要该实体时,可以向系统申请回收这块空间。因此,堆分配是真正的动态分配。

显然,堆分配的空间利用率最高。

栈分配和静态分配也有共性:整块空间是在进程创建时由系统分配的。但是,后者同时分配了所有实体的空间,而前者在进程启动时是空的。另外,栈上的实体和数据段里的实体都是有名实体,可以通过标识符来访问。

  静态分配 栈分配 堆分配
整块空间生成 进程创建时 进程创建时 用一点分配一点
实体生成时间 进程创建时 进程运行时 进程运行时
实体生成者 操作系统 进程 进程申请/系统实施
生命期 永久 临时 完全可控
有名/匿名 有名 有名 匿名
访问方式 能以标识访问 能以标识访问 只能通过指针访问
空间可否回收 不可 不可 可以

三种内存分配模式

 系统为进程分配数据空间有三种形式。静态分配整块静态分配空间,包括其中的所有数据实体,都是在进程创建时由系统一次性分配的(同时为UNIX称为Text的代码分配空间)。这块空间在进程运行期间保持不变。初...
  • boyplayee
  • boyplayee
  • 2007年03月20日 18:58
  • 619

内存的分配模式

单一连续分配:一种简单的存储管理方式,但是只适用于单用户、单任务的操作系统。这种方式将内存分为系统区和用户区两部分,系统区仅仅供给OS使用,通常在低地址,用户区供给用户使用。 固定分区分配:将内存的...
  • u013427969
  • u013427969
  • 2015年08月02日 19:47
  • 517

cpp-编译器的内存分配模式

一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释...
  • googler_offer
  • googler_offer
  • 2017年08月25日 17:16
  • 100

内存分配的三种方式

内存分配有三种方式: 一:从全局存储区域分配:这时内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如:全局变量、static静态变量。 二:从栈区分配:在执行函数的时候,函数中的...
  • chaoshui7758
  • chaoshui7758
  • 2015年09月03日 14:22
  • 2796

c++学习笔记(5)——关于三种内存分配方法

1、第一种:自动分配内存,常与局域变量联系在一起,一个局域变量值在程序执行到该变量定义的时候才会由系统自动分配内存给它,当包含该变量的定义的模块结束的时候,该变量占用的内存自动释放。需要注意的是:当一...
  • leonhe27
  • leonhe27
  • 2016年05月21日 09:49
  • 391

C语言中,二级指针的三种内存模型

二级指针的三种内存模型: 对每种模型进行排序和打印.从中理解二级指针的在内存中的模型建立. 第一种:   指针数组模型      char* pArray[ ] = {"aaaaaa","bbbbbb...
  • csdnliming147
  • csdnliming147
  • 2015年09月22日 21:19
  • 286

深入理解java三种开发模式

工厂模式简单地讲就是用工厂方法代替了new的操作, 在编程时,需要定义一个工厂接口,由不同的的子类去实现,再定一个具体工厂类,定义一个产生实例的方法,我们通过这个方法来获得实例就行了. 工厂模...
  • xfl4629712
  • xfl4629712
  • 2017年02月10日 16:54
  • 830

内存分配模式:静态区、堆、栈

静态区:保存自动全局变量和static变量(包括static全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。堆:由malloc系列函数或new操作符分配的内存,其...
  • ForrestsAndy
  • ForrestsAndy
  • 2010年03月08日 17:29
  • 472

c/c++编译器的内存分配模式

另外还有一篇讲解比较详细的是:http://www.cnblogs.com/lzjsky/archive/2010/11/24/1886720.htm 本文转自:http://my.oschina....
  • ylwdi
  • ylwdi
  • 2013年09月03日 10:19
  • 531

内存虚拟化技术,具体的实现方法有哪两种?

操作系统的内存管理单元(Memory Management Unit,MMU)只能完成一次虚拟地址到物理地址的映射,但获得的物理地址只是虚拟机物理地址而不是机器物理地址,所以需要VMM参与,以获得总线...
  • shenmanli
  • shenmanli
  • 2017年10月23日 10:36
  • 148
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:三种内存分配模式
举报原因:
原因补充:

(最多只允许输入30个字)