什么是存储分配

编译程序的整个编译过程大体分成五部分:词法分析、语法分析、代码优化、存储分配和代码生成。在代码生成之前还必须先确定程序、变量以及常数在内存中存放的地址,这些统称为存储分配。

编译程序的整个编译过程大体分成五部分:词法分析、语法分析、代码优化、存储分配和代码生成。在代码生成之前还必须先确定程序、变量以及常数在内存中存放的地址,这些工作,统称为存储分配,也就是把程序或数据块分配到指定的存储单元的过程。存储分配策略包括:静态存储分配、栈和堆式存储分配;存储分配算法包括:最佳适应算法、最先适应算法、循环最先适应算法。

什么是存储分配

定义

编译程序的整个编译过程大体分成五部分:词法分析、语法分析、代码优化、存储分配和代码生成。在代码生成之前还必须先确定程序、变量以及常数在内存中存放的地址,这些工作,统称为存储分配,也就是把程序或数据块分配到指定的存储单元的过程。

数据区可以分为静态数据区(全局数据区)和动态数据区,后者又可分为堆区和栈区。之所以这样划分,是因为它们存放的数据和对应的管理方法不同。静态数据区、栈区和堆区的存储空间分别遵循 3 种不同的规则:静态存储分配、栈式存储分配和堆式存储分配。后两种分配方式皆称为“动态存储分配”,因为这两种方式中存储空间并不是在编译的时候静态分配好的,而是在运行时才进行的。

某些编程语言,如早期的 FORTRAN 语言及 COBOL 语言等,其存储分配是完全静态的,程序的数据对象与其存储的绑定是在编译期间进行的,称为静态语言。而对于另一些语言,所有数据对象与其存储的绑定只能发生在运行期间,此类语言称为动态语言,如 Lisp、ML、Perl 等。多数语言(如 C/C++、Java、Pascal 等)采取的存储分配策略是介于二者之间的。

静态存储分配

所谓的静态存储分配,即在编译期间为数据对象分配存储空间。这要求在编译期间就可以确定数据对象的大小,同时还可以确定数据对象的数目。

现状

多数(现代)语言只实施部分静态存储分配。可静态分配的数据对象包括大小固定且在程序执行期间可全称访问的全局变量、静态变量、程序中的常量以及 class 的虚函数表等,如 C 语言中的 static 和 extern 变量,以及 C++中的 static 变量,这些数据对象的存储将被分配在静态数据区。

常见做法

从道理上讲,或许可以将静态数据对象与某个绝对存储地址绑定,然而,通常的做法是将静态数据对象的存取地址对应到偶对(DataArerStart,Offset)。Offset 是在编译时刻确定的固定偏移量,而 DataArerStart 则可以推迟到链接或运行时刻才确定。有时,DataArerStart 的地址也可以装入某个基地址寄存器 Register,此时数据对象的存取地址对应到偶对(DataArerStart,Offset),即所谓的寄存器偏址寻址方式。

优点

采用这种方式,存储分配极其简单。

缺点

(1)采用这种方式会带来存储空间的浪费。为解决存储空间浪费问题,人们设计了变量的重叠布局机制,如 FORTRAN 语言的 equivalence 语句。重叠布局带来的问题是使得程序难写难读。

(2)完全静态分配的语言还有另外一个缺陷,就是无法支持递归过程或函数。

(3)对于一些动态的数据结构,例如动态数据(C++中使用 new 关键字来分配内存)以及递归函数的局部变量等最终空间大小必须在运行时才能确定的场合,静态存储分配就无能为力了。

栈式存储分配

栈区是作为“栈”这样的一种数据结构来使用的动态存储区,称为运行栈。运行栈数据空间的存储和管理方式称为栈式存储分配,它将数据对象的运行时存储按照栈的方式来管理,常用于实现可动态嵌套的程序结构,如过程、函数以及嵌套程序块(分程序)等。

活动记录

在过程/函数的实现中,参与栈式存储分配的存储单位拟是活动记录,运行时每当进入一个过程/函数,就在栈顶为该过程/函数分配存放活动记录的数据空间。当一个过程/函数工作完毕返回时,它在栈顶的活动记录数据空间也随机释放。

在过程/函数的某一次执行中,其活动记录中会存放生存期在该过程/函数本次执行中的数据对象以及必要的控制信息单元。一般来说,运行栈中的数据通常都是属于某个过程/函数的活动记录。

必要条件

在编译期间,过程、函数以及嵌套程序块的活动记录大小(最大值)应该是可以确定的(以便进入的时候动态地分配活动记录的空间),这是进行栈式存储分配的必要条件,如果不满足则应该使用堆式存储管理。

堆式存储管理

当数据对象的生存期与创建它的过程/函数的执行期无关时,例如,某些数据对象可能在该过程/函数结束之后仍然长期存在,就不适合进行栈式存储分配。一种灵活但是较昂贵的存储分配方式是堆式存储分配。在堆式存储分配中,可以在任意时刻以任意次序从数据段的堆区分配和释放数据对象的运行时存储空间。通常,分配和释放数据对象的操作是应用程序通过向操作系统提出申请来实现的,因此要占用相当的时间。

两种方式

堆式存储空间的分配和释放可以是显式的,也可以是隐式的。

(1)显式的是指由程序员来负责应用程序的(堆)存储空间管理,可借助编译器和运行时系统所提供的默认存储管理机制。

(2)隐式的是指(堆)存储空间的分配或释放不需要程序员负责,而是由编译器和运行时系统自动完成。

某些语言有显式的存储空间分配和释放命令,如 Pascal 中的 new/deposit,C++中的 new/delete。在 C 语言中没有显式的存储空间分配和释放语句,但程序员可以使用标准库中的函数 malloc()和 free()来实现显式的分配和释放。

某些语言支持隐士的堆区存储空间释放,这需要借助垃圾回收站机制。例如,Java 程序员不需要考虑对象的析构,堆区存储空间的释放是由垃圾回收程序自动完成的。

3 种方案的利弊

对于堆区存储空间的释放,下面简单讨论一下不释放、显式释放以及隐式释放 3 种方案的利弊。

(1)不释放堆区存储空间的方法。这种方法只分配空间,不释放空间,待空间耗尽时停止。如果多数堆数据对象为一旦分配后永久使用,或者在虚存很大而无用数据对象不致带来大零乱的情形下,那么这种方案有可能是合适的。这种方案的存储管理机制很简单,开销很小,但应用面很窄,不是一种通用的解决方案。

(2)显式释放堆区存储空间的方法。这种方法是由用户通过执行释放命令来清空无用的数据空间,存储管理机制比较简单,开销较小,堆管理程序只维护可提供分配命令使用的空闲空间。然而,这种方案的问题是对程序员要求过高,程序的逻辑错误有可能导致灾难性的后果,例如指针悬挂问题。

(3)隐式释放堆区存储空间的方法。该方法的优点是程序员不必考虑存储空间的释放,不会发生指针悬挂之类的问题,但缺点是对存储管理机制要去较高,需要堆区存储空间管理程序具备垃圾回收的能力。

常见存储分配算法

由于在堆式存储分配中可以在任意时刻以任意次序分配和释放数据对象的存储空间,因此程序运行一段时间之后,堆区存储空间可能被划分成许多块,有些被占用,有些空闲。对于堆区存储空间的管理,通常需要好的存储分配算法,使得在面对多个可用的空闲存储块时,根据某些优化原则选择最合适的一个分配给当前数据对象。以下是几类常见的存储分配算法:

最佳适应算法

最佳适应算法,即选择空间浪费最少的存储块。

最先适应算法

最先适应算法,即选择最先找到的足够大的存储块。

循环最先适应算法

循环最先适应算法,,即起始点不同的最先适应算法。

另外,由于每次分配后一般不会用尽空闲存储块的全部空间,而这些剩余的空间又不适于分配给其他数据对象,因而在程序运行一段时间之后,堆区存储空间可能出现许多“碎片”。这样,堆区存储空间的管理中通常需要用到碎片整理算法,用于压缩合并小的存储块,使其更可用。

(0)
时间不会说谎  的头像时间不会说谎  

相关推荐

  • 华为电脑最新版本系统,如何升级和优化

    华为电脑一直以来都备受用户的青睐,其性能优异、外观时尚,备受年轻人的喜爱。华为电脑的最新版本系统也备受瞩目,其带来了更多的新功能和更好的性能。本文将为大家介绍华为电脑最新版本系统的升级和优化方法,让你的电脑更加快速、稳定。一、升级华为电脑

    2023年11月9日
  • RAID怎么做,详解RAID技术的实现方法

    RAID,全称为RedundantArrayofIndependentDisks,即独立磁盘冗余阵列。它是一种通过将多个硬盘组合起来形成一个逻辑磁盘的技术,可以提高数据的可靠性和性能。在本文中,我们将详解RAID技术的实现方法,包括

    2023年11月10日
  • 入耳式耳机戴多久不会影响听力,专家解答

    入耳式耳机近年来越来越受到年轻人的欢迎,因其小巧轻便、随时随地都能使用的特点,成为了很多人日常生活中的必备物品。但是,有些人担心长时间佩戴入耳式耳机会影响听力,那么入耳式耳机戴多久不会影响听力呢?下面请专家为我们解答。一、入耳式耳机的工作

    2023年12月12日
  • 电脑南桥是什么

    电脑南桥是指电脑主板的南桥芯片,是基于个人计算机主板芯片组架构中的其中一枚芯片。南桥设计用来处理低速信号,通过北桥与中央处理器联系。部分的芯片组架构中,会将南桥的功能与北桥集成在一…

  • TP00050AThinkPadT440是什么

    本文目录一览TP00050AThinkPadT440是什么TP00050AThinkPadT440的基本参数TP00050AThinkPadT440的外观设计TP00050AThinkPadT440的性能表现TP00050AThin

    2023年11月7日
  • 华为nova4优缺点,值得购买吗?

    华为nova4是华为公司于2018年12月发布的一款中高端智能手机,其采用了6.4英寸的全面屏设计,搭载了华为自主研发的麒麟970处理器,配备了2000万像素的前置摄像头和4800万像素+2000万像素的后置摄像头,同时还具备了8GB的大内

    2023年11月3日
  • 三星冰箱的散热位置在哪里,如何避免故障

    作为一款颇受欢迎的家电品牌,三星冰箱在市场上一直备受追捧。然而,在使用过程中,一些用户会遇到一些故障,其中最常见的就是散热不良。那么,三星冰箱的散热位置在哪里?如何避免故障呢?本文将为您一一解答。一、三星冰箱散热位置在哪里?三星冰箱散热

    2023年11月17日
  • 明基摄像机D39说明书,如何下载和使用

    作为一款性价比极高的摄像机,明基D39备受消费者青睐。但是在使用过程中,很多人都会遇到一些问题,比如如何下载和使用说明书。本文将为大家详细介绍明基摄像机D39的使用方法及说明书下载方式。一、明基摄像机D39的基本功能明基摄像机D39是一

    2023年11月4日
  • 荣耀平板9上市时间,你知道吗?

    荣耀平板9是一款备受期待的平板电脑,它的上市时间备受关注。今天,我们就来了解一下荣耀平板9的上市时间,以及这款平板电脑的特点和功能。荣耀平板9上市时间荣耀平板9的上市时间一直备受关注,目前,荣耀官方还没有公布具体的上市时间。但是,根据业

    2023年10月20日
  • 华为荣耀4a参数配置,有哪些重要的硬件规格?

    作为一款中端手机,华为荣耀4a在硬件配置上并不会过于出色,但是依然有着不少的亮点。下面我们就来一起看看华为荣耀4a的重要硬件规格。CPU和GPU华为荣耀4a采用了高通骁龙430八核处理器,主频为1.2GHz。这款处理器采用了28

    2023年10月30日
  • 微信如何打造朋友圈(微信如何打造朋友圈功能)

    本篇文章给大家谈谈微信如何打造朋友圈,以及微信如何打造朋友圈功能对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、微信朋友圈怎么设置2、微信朋友圈怎么做才有价值?3、微信朋友圈如何设置?微信朋友圈怎么设置1、打开微

    2023年10月1日
  • 松下微波炉gt353m代工,如何分辨正品与山寨

    松下微波炉GT353M是一款备受消费者喜爱的微波炉,不仅外观时尚,而且功能齐全,深受用户的青睐。然而,随着市场需求的增长,一些不良商家开始生产和销售山寨版的松下微波炉GT353M,这些山寨版的产品质量参差不齐,给消费者带来了很多麻烦。因此,

    2023年10月12日
  • 12366社保缴费(中国税务12366社保缴费)

    本篇文章给大家谈谈12366社保缴费,以及中国税务12366社保缴费对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、12366怎么查社保缴费记录2、广西税务12366微信号怎么交新生儿社保费3、12366社保缴费怎

    2023年10月16日
  • 手机怎么取消休眠模式,一步步教你解决手机休眠问题

    手机休眠模式是一种省电模式,当手机长时间不使用时,它会自动进入休眠模式。虽然休眠模式可以帮助我们省电,但有时候我们需要让手机保持常亮状态,比如在使用导航或者观看视频时。那么,该如何取消手机的休眠模式呢?本文将一步步教你解决手机休眠问题。一

    2023年10月28日
  • 华为5G模组供应商,哪些公司是华为5G模组的主要供应商

    随着5G时代的到来,华为作为全球领先的通信技术供应商,其5G技术也受到了广泛的关注。而在5G技术中,5G模组则是至关重要的一个组成部分。那么,哪些公司是华为5G模组的主要供应商呢?本文将为您揭秘。一、高通作为全球领先的无线通信技术和产品

    2023年12月7日

发表回复

登录后才能评论