您知道这是否也发生在本机 Windows 环境中?
在本机 Windows 8 上(由 Mingw64 编译,从任务管理器获取统计信息);您的代码消耗 25.6 MB 的物理内存。通过将其更改为“size_t bytes = 1;”,物理内存消耗变为 0.2 MB;这意味着VirtualAlloc() 本身负责大约 25.4 MB 的物理内存。
请注意,需要一些物理内存来跟踪保留的区域;并且因为您可以独立地释放/分配单个页面,这可能不仅仅是“整个区域的开始和结束”(并且可能是该区域中每 1 GiB 或 2 MiB 或 4 KiB 块的单独标记,以与 CPU 用于“虚拟地址到物理地址”转换的表结构一致)。
编辑
基于 cmets(对不同大小的虚拟内存进行重复测试),我将这个烂摊子拼凑在一起(一个循环,将分配的大小加倍并报告每个有效大小的结果):
#define __USE_MINGW_ANSI_STDIO 1
#include <windows.h> /* VirtualAlloc() */
#include <psapi.h>
#include <stdio.h> /* getchar() */
#include <stddef.h> /* size_t */
int main(void) {
HANDLE hProcess;
PROCESS_MEMORY_COUNTERS pmc;
void *address;
size_t size = 1;
hProcess = GetCurrentProcess();
if (NULL == hProcess) {
printf( "OpenProcess() failed\n");
getchar();
return 1;
}
while( (address = VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS)) != NULL) {
if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) ) {
printf( "Size %zu = Working set size: %u\n", size, pmc.WorkingSetSize );
}
VirtualFree(address, size, MEM_RELEASE);
if(size > SIZE_MAX / 2) {
break;
}
size += size;
}
CloseHandle( hProcess );
getchar();
return 0;
}
在我的电脑上输出是:
Size 1 = Working set size: 1560576
Size 2 = Working set size: 1597440
Size 4 = Working set size: 1597440
Size 8 = Working set size: 1597440
Size 16 = Working set size: 1597440
Size 32 = Working set size: 1597440
Size 64 = Working set size: 1597440
Size 128 = Working set size: 1597440
Size 256 = Working set size: 1597440
Size 512 = Working set size: 1597440
Size 1024 = Working set size: 1597440
Size 2048 = Working set size: 1597440
Size 4096 = Working set size: 1597440
Size 8192 = Working set size: 1597440
Size 16384 = Working set size: 1597440
Size 32768 = Working set size: 1597440
Size 65536 = Working set size: 1597440
Size 131072 = Working set size: 1597440
Size 262144 = Working set size: 1597440
Size 524288 = Working set size: 1597440
Size 1048576 = Working set size: 1597440
Size 2097152 = Working set size: 1597440
Size 4194304 = Working set size: 1597440
Size 8388608 = Working set size: 1597440
Size 16777216 = Working set size: 1597440
Size 33554432 = Working set size: 1597440
Size 67108864 = Working set size: 1597440
Size 134217728 = Working set size: 1597440
Size 268435456 = Working set size: 1597440
Size 536870912 = Working set size: 1597440
Size 1073741824 = Working set size: 1601536
Size 2147483648 = Working set size: 1605632
Size 4294967296 = Working set size: 1613824
Size 8589934592 = Working set size: 1630208
Size 17179869184 = Working set size: 1662976
Size 34359738368 = Working set size: 1728512
Size 68719476736 = Working set size: 1859584
Size 137438953472 = Working set size: 2121728
Size 274877906944 = Working set size: 2646016
Size 549755813888 = Working set size: 3694592
Size 1099511627776 = Working set size: 5791744
Size 2199023255552 = Working set size: 9986048
Size 4398046511104 = Working set size: 18374656
Size 8796093022208 = Working set size: 35151872
Size 17592186044416 = Working set size: 68706304
Size 35184372088832 = Working set size: 135815168