如何按顺序或在指定的地址分配内存?
How to allocate memory sequentially or at the indicated addresses?
我需要按顺序分配内存池。我没有想出比通过VirtualAlloc分配内存更好的办法,因为我需要控制页面的访问权限。但是当我尝试使用 VirtualAlloc 时,如果我指定要从中分配内存的地址,我可能会在池或空指针之间出现一个大洞。
_SYSTEM_INFO sys;
GetSystemInfo(&sys);
// 0x0000028ea9450000
LPVOID mem = VirtualAlloc(NULL, sys.dwPageSize * 2, MEM_COMMIT, PAGE_READWRITE);
// 0x0000028ea94d0000
LPVOID mem2 = VirtualAlloc(NULL, sys.dwPageSize * 2, MEM_COMMIT, PAGE_READWRITE);
在该代码中,我在两个内存位置之间有一个等于 525KB 的洞! 我知道,VirtualAlloc 和其他方法按页面(我的机器中有 4096 字节(进行分配,我需要它,但我不明白为什么地址之间有这么大的差异?
我可以在指定的地址分配内存,或者哪种算法使用 OC 来查找要分配的内存吗?
如果不指定映射内存位置的开始地址,内核将使用一些启发式方法来确定最佳位置。留下一些空白是其中的一部分。
分配连续地址空间块的常用方法,首先通过分配一个大区域来保留它们,覆盖整个地址空间,其中较小的大块头被分配到MEM_RESERVE
标志中。完成后,您可以正确进行分配,使用lpAddress
参数指定要放置它的特定地址。
SIZE_T sz1 = sys.dwPageSize * 4;
SIZE_T sz2 = sys.dwPageSize * 2;
SITE_T off = 0;
LPVOID base = VirtualAlloc(NULL, sys.dwPageSize * 2, MEM_RESERVE, PAGE_GUARD);
LPVOID mem = VirtualAlloc((BYTE*)base + off, sz1, MEM_COMMIT, PAGE_READWRITE);
off += sz1
LPVOID mem2 = VirtualAlloc((BYTE*)base + off, sz2, MEM_COMMIT, PAGE_READWRITE);
相关文章:
- 将数组的地址分配给变量并删除
- 将地址分配给本地指针后,公共对象的变量将消失
- LLVM 传递以在特定地址分配内存
- 如何按顺序或在指定的地址分配内存?
- C 内存地址分配
- 有没有其他方法可以将地址分配给指针变量
- 我可以将文件描述符的地址分配给变量
- 将地址分配给结构内的指针
- 如何将数组的地址分配给指针
- 尝试将派生类对象地址分配给基类指针的向量
- 将派生的对象地址分配给基础指针和调用击路仪的机制
- 在 c++ 中使用指针访问 2d 数组,如何将地址分配给指针
- 查询与将地址分配给共享_ptr有关
- 将非常量的地址分配给常量指针
- 类的地址分配
- 将 int 自己的地址分配给其值
- 如果指定了参数,如何将地址分配给函数指针
- std::bad_alloc从引用的地址分配指针
- 在该地址c++分配之前和之后相等指针之间的差异
- 在窗口中的特定地址分配数据