内存分配方式

226 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

title: "28.内存分配方式"
created: '2022-05-08T07:11:50.441Z'
modified: '2022-05-08T08:03:19Z'
tags: [Notebooks/面经, C++]

内存分配方式

内存分配方式:在C++中内存共分为5个区,分别是堆、栈、自由存储区、全

局/静态存储区、常量存储区。

栈:在执行过程中,局部作用域出现的一些局部变量可以在栈上创建,等脱离该作用域创建的内存被释放。计算机会在底层堆栈提供支持:分配专门的寄存器分配栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。

堆:用于程序内存动态分配,用C/C++中的new/malloc分配,delete/free释放。堆的生长空间向上,地址越来越大,栈的生长空间向下,地址越来越小,堆空间因为会由频繁的分配释放操作,会产生内存碎片,存储局部变量。

自由存储区:它是C++基于new操作符的一个概念,凡是通过new操作符申请的内存即为自由存储区、

全局/静态存储区:这块内存在程序编译期已经分配好,在程序运行阶段一直存在。全局变量和静态变量。

常量存储区:特殊的一块内存,里面存放的是常量,不允许修改。

内存分配方式:

内存分配方式有两种:连续内存分配方式和离散内存分配方式。

①连续内存分配方式

1)固定分区分配

将内存划分成若干个固定大小的块。将程序装入块中即可。内存划分成各个块之后,块大小不再改变。当然,划分块的方式有:所有的块大小相等;划分的块大小不相等。

这种方式,在实际的内存分配之前,就已经知道了所有的内存块大小了。

2)动态分区分配

需要一个空闲表 或者 空闲链 来记录目前系统中空间的内存区域。在内存分配时,需要查找空间表或空闲链找到一块内存分配给当前进程。

动态分区分配算法:

a)首次适应法

b)循环首次适应法

c)最佳适应法

d)最坏适应法

e)快速适应法

②离散内存分配方式

内存资源是有限的,程序要运行,必须得加载到内存。如果内存已经满了,而现在又有新的

程序要运行,怎么办?---SWAP

把当前不用的程序(数据)先换出内存,从而就有空间加载当前需要运行的程序的一部分数据进入内存,这样大大提高了内存的利用率。