内存动态分区分配_动态内存分配介绍

ae4297352fdd6353b3665b604fd56085.png

C语言的内存分配方式:堆和栈

基于缓存的存储器层次结构

当C程序在运行过程中需要额外虚拟内存时,可以使用动态内存分配器(Dynamic Memory Allocator)。

动态内存分配器维护着一个进程的虚拟内存区域,成为堆(heap)。假设堆是一个请求二进制零的区域,它紧接在未初始化的数据区域后开始,并向上生长(向更高地址)。对于每个进程,内核维护着一个变量brk,它指向堆的顶部。

78790f4a229f00535972890bf887473c.png

分配器将堆视为一组不同大小的块(block)的集合来维护。每个块就是一个连续的虚拟内存片(chunk),要么是已分配的,要么是空闲的。已分配的块显式地保留为供应用程序使用。空闲块可用来分配,空闲块保持空闲,直到它显式地被应用分配。一个已分配的块保持已分配状态,直到它被释放,这种释放要么是应用程序显式执行的,要么是内存分配器自身隐式执行的。

分配器有两种基本风格。两种风格都要求应用显式地分配块。它们的不同之处在于由哪个实体来负责释放已分配的块。

  • 显示分配器(explicit allocator):要求应用显式地释放任何已分配的块。如C标准库提供的malloc、free函数。C++中的new、delete操作符。
  • 隐式分配器(implicit allocator):要求分配器检测一个已分配的块何时不再被程序所使用,则释放这个块。隐式分配器也叫做垃圾收集器(garbage collector),自动释放未使用的已分配的块的过程叫做垃圾收集(garbage collection)。如Java之类的高级语言就依赖垃圾收集来释放已分配的块。
64e42b93799c862a090363160a8509b3.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值