博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚拟内存(VirtualAlloc),堆(HeapAlloc/malloc/new)和Memory Mapped File
阅读量:6654 次
发布时间:2019-06-25

本文共 594 字,大约阅读时间需要 1 分钟。

内存管理有三种方式:

1. 虚拟内存,VirtualAlloc之类的函数

2. 堆,Heapxxx函数,malloc,new等

3. 内存映射文件,Memory Mapped File

非常多人都会困惑,可是看以下的图片就会比較明确了。这个图片从MSDN上拷来。

堆和虚拟内存。从上面的图片就能够看出,事实上所谓的堆,也就是在虚拟内存上抽象出来的。

假设直接用Virtualxxx系列函数,是有一些限制的,比方每次仅仅能分配页大小倍数的内存。内存地址也必须对齐什么的。新手非常难用。正由于如此,才出现了堆。实际上堆Heap内部就是使用Virtual系列函数的。基本思想就是:先用VirtualAlloc分配一个比較大的内存,然后用户每次申请堆内存的时候,从分配出来的虚拟内存块上指定一块给用户。比方第一次分配堆内存从A地址開始的100个字节,第二次分配的时候就是A+100開始。

Memory Mapped File就不太一样了,从上面的图能够看出MMF并没有调用Virtual系列函数。它直接调用内核层了。

对于malloc和new,这2个并非操作系统API,它们是语言提供的函数。在不同的系统上面有不同的实现方法,在Windows上面,new调用malloc,malloc调用堆函数(heapxxx)。堆函数调用Virtual系列函数。在Linux上面就调用对应的linux API.

你可能感兴趣的文章
DJANGO,获取当前用户名,用户组名,用户组权限
查看>>
mysql 常用函数
查看>>
可变长参数列表误区与陷阱——va_arg不可接受的类型
查看>>
说说自己对nofollow标签的一些看法
查看>>
通过URL参数请求不同的后端服务器
查看>>
MySQL 可以用localhost 连接,但不能用IP连接的问题
查看>>
linux学习(之二)-初识linux的一些常用命令
查看>>
linux基础系统管理---系统管理
查看>>
重启网络出现RTNETLINK answers: File exists问题解决
查看>>
C++学习笔记——类
查看>>
Linux命令之chkconfig
查看>>
JVMTI开发教程之一个简单的Agent
查看>>
Git学习笔记
查看>>
Developer Express 之 XtraReport报表预览控件PrintControl设置
查看>>
java中switch使用的数据类型
查看>>
linux修复丢失的分区表
查看>>
【python】操作oracle数据库
查看>>
Symantec BE2012 0xe000fec9 报错
查看>>
iOS 开发遇到的问题
查看>>
单臂路由的实现
查看>>