Winapi 如何在Windows上获取熟悉页面表的realloc()?

Winapi 如何在Windows上获取熟悉页面表的realloc()?,winapi,memory-management,paging,realloc,virtual-memory,Winapi,Memory Management,Paging,Realloc,Virtual Memory,指示现代虚拟内存操作系统上的realloc的某些实现操作页表,而不是实际复制数据 这对于使用大型阵列的程序显然是可取的。如果您的计算机有16GB内存,并且您希望将8GB阵列增加到10GB,则基于页面表的realloc将快速工作,而复制realloc则需要将页面调出到磁盘 我在Windows 7(MSVC 2013)和OS X 10.8 Mountain Lion(Clang++2.79)上编译并运行了以下程序。这两台机器都有16GB的内存。编译器正在优化O2。我添加了写操作以防止优化和过度使用技

指示现代虚拟内存操作系统上的
realloc
的某些实现操作页表,而不是实际复制数据

这对于使用大型阵列的程序显然是可取的。如果您的计算机有16GB内存,并且您希望将8GB阵列增加到10GB,则基于页面表的
realloc
将快速工作,而复制
realloc
则需要将页面调出到磁盘

我在Windows 7(MSVC 2013)和OS X 10.8 Mountain Lion(Clang++2.79)上编译并运行了以下程序。这两台机器都有16GB的内存。编译器正在优化
O2
。我添加了写操作以防止优化和过度使用技巧

#include <stdlib.h>

size_t const GIG = 1000 * 1000 * 1000;
size_t const BIG = 4 * GIG;
size_t const HUGE = 6 * GIG;

int main()
{
    char *mem = (char *)malloc(BIG);
    for (size_t i = 0; i < BIG; ++i) {
        mem[i] = i & 0xFF;
    }
    mem = (char *)realloc(mem, HUGE);
    for (size_t i = BIG; i < HUGE; ++i) {
        mem[i] = i & 0xFF;
    }
    free(mem);
}
#包括
尺寸常数GIG=1000*1000*1000;
尺寸常数大=4*GIG;
尺寸=6*GIG;
int main()
{
char*mem=(char*)malloc(大);
对于(尺寸i=0;i
在Windows上,进程在资源监视器中的提交值峰值为10GB。在OSX上,活动监视器中进程的虚拟内存值不超过6GB

如果我将
BIG
更改为8GB,将
BIG
更改为10GB,那么它们的总和将大于物理内存,Windows版本将通过磁盘分页使系统崩溃,而OSX版本则不会

这些测试表明Windows的
realloc
复制数据,而OS X的
realloc
操作页面表

我没有Linux机器,但通过glibc和Linux源代码来证明Linux的
realloc
为大型阵列操纵页面表

注意到Windows的慢
realloc
,但是作者通过更改程序而不是使用不同的分配器来绕过它

一定有办法在Windows上获得理想的页表行为。是否有不同的内存分配API提供它

编辑:这行吗?对于每个大型阵列,使用
VirtualAlloc
保留整个系统内存大小的虚拟地址范围,然后根据需要提交物理内存。对于处理多个大型阵列的程序,这仅在地址空间比物理内存大得多的情况下才起作用。但在不久的将来,对于64位桌面系统来说,这似乎是一个安全的假设。即使是当前x64 CPU上的48位地址总线也可以寻址281475 GB内存