- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 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;
}
没有错误
最佳答案
区别是这样的:使用 MEM_RESERVE
你基本上是在对操作系统说:“嘿,拜托,我需要这个连续的虚拟内存页 block ,你能给我一个适合我需要的内存地址吗?”
操作系统会计算在哪里保留您的 block 。但它还不会分配任何东西。(要了解操作系统如何执行此操作,只需查看 Mark Russinovich 所著的《Windows Internals 5th》等书籍即可 - 提示:在 Google 上搜索有关 VAD 树的信息)。
所以,当你保留一 block 内存时,操作系统会简单地在某处的树上分配一个“节点”,或者类似的结构,说这些地址是保留的,就像餐厅的 table 一样,并且不能在对 VirtualAlloc()
的其他调用中使用。
相反,当您使用MEM_COMMIT
实际提交页面时,操作系统实际上是在您之前保留的 block 上分配虚拟内存页面。当然,您只能在之前保留的 block 上提交页面。不这样做就像在餐厅预订座位,然后坐在另一张 table 上,而不是由您预订。
注意:这些页面实际上并没有分配,也没有提交,因为您对它们进行读/写(软页面错误)。这是一个非常有用的优化。
注意2:您可以 OR MEM_RESERVE|MEM_COMMIT
的事实只是有用的,因此您不必调用 `VirtualAlloc()' API 两次,但实际上它们仍然是两次非常不同的操作。
NOTE3:MEM_COMMIT
标志将在页面大小边界上提交页面,而使用 MEM_RESERVE
或 MEM_RESERVE|MEM_COMMIT
将保留或保留+在大于页面大小的边界上提交页面,从今天起,在所有版本的 Windows 上通常为 64K。您可以通过调用 GetSystemInfo()
获取此号码。
关于memory - VirtualAlloc MEM_COMMIT 和 MEM_RESERVE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57394359/
我对 VirtualAlloc 有点困惑, 我们可以使用 MEM_RESERVE 保留内存,然后使用 MEM_COMMIT 提交它,但我对以下两个函数使用时的区别有点困惑: m_pvData = Vi
我对 VirtualAlloc 有点困惑, 我们可以使用 MEM_RESERVE 保留内存,然后使用 MEM_COMMIT 提交它,但我对以下两个函数使用时的区别有点困惑: m_pvData = Vi
首先,让我说我很清楚如何VirtualAlloc()工作原理以及现代操作系统的虚拟内存设施通常如何工作。 表示,使用MAP_RESERVE VirtualAlloc() 的标志Windows API,
据我了解,MEM_RESERVE 实际上是“空闲”内存,即可供我的进程使用,但尚未分配?或者它以前被分配,但后来被释放了? 具体来说,在下面的 !address 输出中查看我几乎没有虚拟地址空间(99
首先,我非常清楚 VirtualAlloc() 是如何工作的:当我保留内存块时,我得到的地址对齐到 64K 边界,(这个值可以很容易地通过 GetSystemInfo()),然后当我提交页面时,我将它
以下对 VirtualAlloc() 的调用在 x64 上返回错误 ERROR_INVALID_PARAMETER: LPVOID lp = VirtualAlloc(NULL, 0x10000000
我是一名优秀的程序员,十分优秀!