Memory 虚拟内存提交和内存保留

Memory 虚拟内存提交和内存保留,memory,virtualalloc,Memory,Virtualalloc,我对VirtualAlloc有点困惑 我们可以使用MEM_reserve保留内存,然后使用MEM_commit提交,但我不太清楚使用以下两个函数时的区别: m_pvData = VirtualAlloc(NULL, m_nBuffSize, MEM_COMMIT, PAGE_READWRITE); m_pvData = VirtualAlloc(NULL, m_nBuffSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 第二种选择的好处是什么 我

我对VirtualAlloc有点困惑

我们可以使用MEM_reserve保留内存,然后使用MEM_commit提交,但我不太清楚使用以下两个函数时的区别:

m_pvData = VirtualAlloc(NULL, m_nBuffSize, MEM_COMMIT, PAGE_READWRITE);
m_pvData = VirtualAlloc(NULL, m_nBuffSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
第二种选择的好处是什么

我可以使用以下函数获取缓冲区:

void* pdata = VirtualAlloc(NULL, 64*1024*1024, MEM_COMMIT, PAGE_READWRITE);
if (pdata == NULL)
{
    cout<<"Last error is "<<GetLastError()<<endl;
}
void*pdata=VirtualAlloc(NULL,64*1024*1024,MEM\u COMMIT,PAGE\u READWRITE);
if(pdata==NULL)
{
cout区别在于:
使用
MEM_RESERVE
基本上是对操作系统说:“嘿,拜托,我需要这个连续的虚拟内存页块,你能给我一个适合我需要的内存地址吗?”

操作系统会计算在何处保留块。 但现在还不会。 (要了解操作系统是如何做到这一点的,只需看看马克·鲁西诺维奇(MarkRussinovich)的《WindowsInternals5th》之类的书——提示:在谷歌上搜索有关VAD树的内容)

因此,当您保留一块内存时,操作系统只需在某个位置的树上分配一个“节点”或类似的结构,说明这些地址是保留的,就像餐厅的桌子一样,不能用于对
VirtualAlloc()
的其他调用

相反,当您实际使用
MEM_commit
提交页面时,操作系统实际上是在您之前保留的块上分配虚拟内存页面。 当然,您只能在以前保留的块上提交页面。 不这样做就像在一家餐厅预订座位,然后在另一张桌子上坐下,而不是由你预订

注意:由于您对页面进行了读/写操作(软页面错误),因此页面实际上也没有分配提交。这是一个非常有用的优化

注2:您可以或
MEM_RESERVE | MEM_COMMIT
这一事实非常有用,因此您不必两次调用'VirtualAlloc()'API,但实际上它们仍然是两个非常不同的操作


注3:
MEM_COMMIT
标志将在页面大小边界上提交页面,而使用
MEM_RESERVE
MEM_RESERVE | MEM_COMMIT
将在大于页面大小的边界上保留或保留+提交页面,从今天起,在所有版本的Windows上通常为64K。您可以通过调用
GetSystemInfo()

因为第一个在技术上是不正确的。您不能在没有保留的情况下提交。但是我可以使用下面的函数来分配缓冲区,如下所示:void*pdata=VirtualAlloc(NULL,64*1024*1024,MEM\u commit,PAGE\u READWRITE);if(pdata==NULL){操作系统可以猜出你的意思。所以没有区别。但是你应该通过这两个。不要让操作系统掩盖你的错误。总有一天操作系统可能会停止对编程错误如此宽容。我明白了,谢谢你的帮助。原来操作系统是个好人