Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何按顺序或按指定地址分配内存?_C++_Windows - Fatal编程技术网

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

C++ 如何按顺序或按指定地址分配内存?,c++,windows,C++,Windows,我需要按顺序分配内存池。我没有想出比通过VirtualAlloc分配内存更好的方法,因为我需要控制页面的访问权限。但是当我尝试使用VirtualAlloc时,如果我指定分配内存的地址,我可能会在池之间出现一个大洞或空指针 _SYSTEM_INFO sys; GetSystemInfo(&sys); // 0x0000028ea9450000 LPVOID mem = VirtualAlloc(NULL, sys.dwPageSize * 2, MEM_COMMIT, PAGE_READ

我需要按顺序分配内存池。我没有想出比通过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);

也许你应该自己分配更大的内存块,自己处理池?@一些程序员朋友,是的,这是个好主意,但我需要有几个或一个池,如果没有足够的空间可以扩展。编译器可能有一种特殊的语法,用于在特定的地址或段分配变量。例如,IAR编译器使用“@Memory_Segment”在内存段中放置变量。