对于 Windows 32 来说,系统会给每个进程 4GB 的地址空间,低端 2GB ( $00000000-$7FFFFFFF )给用户支配;高端 2GB ( $80000000-$FFFFFFFF )留给系统使用,这个 4G 的地址空间叫“虚拟地址表”,虚拟地址表不是真实的内存。
这个“虚拟地址表”上有 4GB 的空间,每个程序都有这样的一个表,但他们并不会冲突,这样就阻断了一个进程对另一个进程的访问,系统在需要的时候会把他们映射成具体的真实内存地址。
可以使用 GlobalMemoryStatus 来获取内存信息,获取后的信息放在 TMemoryStatus 结构体中。
_MEMORYSTATUS = record dwLength: DWORD; {结构长度} dwMemoryLoad: DWORD; {表示可用内存比例的一个整数, 100 表示内存都可用} dwTotalPhys: DWORD; {物理内存总数} dwAvailPhys: DWORD; {可用物理内存总数} dwTotalPageFile: DWORD; {虚拟内存总数} dwAvailPageFile: DWORD; {可用虚拟内存总数} dwTotalVirtual: DWORD; {虚地址表中的地址总数} dwAvailVirtual: DWORD; {虚地址表中可用的地址总数} end; TMemoryStatus = _MEMORYSTATUS;
在用户的 2GB 地址空间中,低端的 0-$FFFF 是用于空指针分配,高端的 $7FFF0000-$7FFFFFFF 用于进程的临界区,这两个地址都是禁止访问的。 进程真正的私有空间地址是: $10000-$FFEFFFF 。我们可以通过 GetSystemInfo 函数得到证实,函数返回 TSystemInfo 结构,结构中的lpMinimumApplicationAddress 和 lpMaximumApplicationAddress 分别标识程序可以访问的最低与最高地址,通过 GetSystemInfo 还能得到一个内存相关的重要参数:页大小( PageSize ),通常大小是 4K ,我们需要知道的是,用 VirtualAlloc 函数分配的内存就是 PageSize ( 4K )为最小单位,假如我们用 VirtualAlloc 给一个整数分配内存,就会浪费 4092 个字节。
本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/p/5398917.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人