gpt4 book ai didi

c++ - 如何按顺序或在指定地址分配内存?

转载 作者:行者123 更新时间:2023-12-01 19:19:01 33 4
gpt4 key购买 nike

我需要按顺序分配内存池。我没有想出比通过 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来查找内存进行分配?

最佳答案

如果不指定映射内存的起始地址,内核将使用一些启发式方法来确定最佳位置。留下一些间隙是其中的一部分。

分配连续地址空间 block 的常用方法是,首先通过分配一个大区域来保留它们,覆盖整个地址空间,并使用 MEM_RESERVE 标志将较小的 block 分配到其中。完成后,您可以使用 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);

关于c++ - 如何按顺序或在指定地址分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59251005/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com