VirtualFree是否解锁VirtualLock? 我重写了相当老的C++代码,在内存管理方面跌跌撞撞。

VirtualFree是否解锁VirtualLock? 我重写了相当老的C++代码,在内存管理方面跌跌撞撞。,c++,memory-management,C++,Memory Management,更具体地说,“需要”的内存首先以类似于 int* Buffer; int numPoints=80000; Buffer = (int*)VirtualAlloc(NULL, numPoints* sizeof(int), MEM_COMMIT, PAGE_READWRITE); VirtualLock(Buffer,numPoints * sizeof(int)); 但是,仅使用VirtualFree释放缓冲区,而不是VirtualUnlock 那么,第一个问题:VirtualFree是否调

更具体地说,“需要”的内存首先以类似于

int* Buffer;
int numPoints=80000;
Buffer = (int*)VirtualAlloc(NULL, numPoints* sizeof(int), MEM_COMMIT, PAGE_READWRITE);
VirtualLock(Buffer,numPoints * sizeof(int));
但是,仅使用
VirtualFree
释放缓冲区,而不是
VirtualUnlock

那么,第一个问题:VirtualFree是否调用VirtualUnlock?

此外,我还读了一些关于
VirtualLock
。在我的代码中,它显然是用来提高性能的,因为很多非常大的数组被频繁地使用和访问,部分甚至被绘制成一个2 fps左右的图形。。。然而,我读到1。Virtuallock可能会降低系统性能,最终会再次减慢速度并降低2。Virtuallock并没有真正提高大型缓冲区的性能。后一种说法在这里用strassen HBC()进行了测试

因此,我将决定反对
VirtualLock
,但是声明
VirtualLock
将确保随后对该区域的访问不会导致页面错误。这是否意味着,注释掉
VirtualLock
会使访问像
*(buffer+10)=1
一样失败或产生页面错误(前提是缓冲区有超过11个分配点)

所以第二个问题是:我可以安全地放弃锁定内存而不使阵列访问面临页面错误或崩溃的危险吗?是的。VirtualFree(MEM_RELEASE/MEM_DECOMMIT)如果该区域已被VirtualLock()锁定,则将其解锁

而VirtualLock()仍然很有用,因为它使访问速度更快。 (此外,有些任务需要非分页内存,就像重叠IO一样。) 没有VirtualLock(),无论物理内存大小如何,都不能保证超过100兆字节的缓冲区不分页,因为O.S往往会为内核的非分页池和IO缓存保留物理内存

顺便说一下,您需要设置ProcessWorkingSetSize()来保护自己进程的物理内存。 如果没有足够的进程工作集,VirtualLock()可能会失败

IMHO为通用软件(运行在各种系统上,系统内存大小未知)锁定巨大的内存区域不是一个好主意,因为它从O.s.的关键部分窃取物理内存。 将其用于专用计算机上运行的软件(如专用服务器或专用编码PC)。

是的。VirtualFree(MEM_RELEASE/MEM_DECOMMIT)如果该区域已被VirtualLock()锁定,则将其解锁

而VirtualLock()仍然很有用,因为它使访问速度更快。 (此外,有些任务需要非分页内存,就像重叠IO一样。) 没有VirtualLock(),无论物理内存大小如何,都不能保证超过100兆字节的缓冲区不分页,因为O.S往往会为内核的非分页池和IO缓存保留物理内存

顺便说一下,您需要设置ProcessWorkingSetSize()来保护自己进程的物理内存。 如果没有足够的进程工作集,VirtualLock()可能会失败

IMHO为通用软件(运行在各种系统上,系统内存大小未知)锁定巨大的内存区域不是一个好主意,因为它从O.s.的关键部分窃取物理内存。
将其用于在专用计算机上运行的软件(如专用服务器或专用编码PC)。

很难猜到您自己是怎么搞不清楚的。正确地做,正确地做,永远不会有任何错误,你不必去发现。当然,VirtualLock()在具有千兆字节RAM的现代机器上变得毫无意义。@HansPassant好吧,请容忍我仍然没有看到它。^^^我对你的评论的理解正确吗,virtualFree并没有叫VirtualLock?。此外,我确实分配了1-2GB的内存,所以在现代机器上锁定内存也没关系吗?@HansPassant无法用语言表达我最强烈的异议。当然,VirtualLock仍然是非常有效的。很难猜测你怎么会自己不明白这一点。正确地做,正确地做,永远不会有任何错误,你不必去发现。当然,VirtualLock()在具有千兆字节RAM的现代机器上变得毫无意义。@HansPassant好吧,请容忍我仍然没有看到它。^^^我对你的评论的理解正确吗,virtualFree并没有叫VirtualLock?。此外,我确实分配了1-2GB的内存,所以在现代机器上锁定内存也没关系吗?@HansPassant无法用语言表达我最强烈的异议。当然,VirtualLock仍然非常有效。出于安全原因,它最有用。出于安全原因,它最有用。