繁体   English   中英

Windows C代码上的内存分配

[英]Memory allocation on Windows C code

我想知道在Windows C编程中推荐哪种方法:使用malloc或Win32 HeapAlloc(可能是VirtualAlloc?)函数。

我已经阅读了有关malloc和HeapAlloc的MSDN 内存管理函数文章和MSDN文章,但是他们没有说明应该使用哪一个以及在什么情况下。

坚持使用malloc除非你有令人信服的理由使用不同的东西。 它将在OS内存分配原语的基础上实现,但是自己潜入该层并没有真正的优势。

我相信一些API调用需要从Windows堆分配的内存块,但是当你遇到它们时你会知道。

或者如果你想做更高级的事情,比如使用共享内存,或者需要直接控制内存页面上的权限,那么你需要查看像VirtualAlloc这样的Windows API调用。

VirtualAlloc和朋友可以为您提供一些优势,如果您确实要处理大量数据,或者无论如何您都需要设置自己的内存管理器。

否则,使用malloc()更容易,当然更便携。

VirtualAlloc有一个名为MEM_RESET的漂亮功能,它使一块内存中的数据无效,但保持分配。 这意味着如果它被分页到磁盘,Windows将无法在您下次访问时将其重新分页。 如果您有许多突然变得不必要的数据,那将是很好的,但您很快就会有其他东西来填充缓冲区。

它还区分了保留地址空间和实际请求内存。 如果你有充分的理由去解决所有麻烦,那里有一些不错的东西。

还有一件事:malloc()保证可移植(至少对任何ANSI-C实现)并且更加优雅。

在某些使用HeapAlloc等功能的情况下,HeapFree会让您的生活更轻松。 一个例子是:一个大型应用程序,你需要在一个模块中分配内存(例如在library1.dll中)并释放主模块中的内存(比如program.exe)。 如果您使用的是HeapAlloc,HeapResize和HeapFree函数,则可以安全地完成此操作,但无法使用C运行时库(例如malloc,free,resize)完成。

但是:如果你没有充分的理由,你应该坚持使用malloc / free / resize函数。 此外,如果您需要更改已分配内存的权限(例如:生成可执行文件等),则应使用VirtualAlloc,VirtualFree等函数。

您可以创建一个包装器并保留更改实现详细信息的选项。 您甚至可以将这两个选项与您的代码进行比较然后再决定。

与Rob不同,我走的是另一种方式......因为我选择针对WinAPI进行编码,所以我使用的是本机函数而不是C运行时函数,无论如何它们只是一个很薄的包装器。

使用HeapAlloc,您可以为不同的任务/子系统分别使用堆。 这可以简化大型应用程序的转储分析。

使用malloc,您只能使用一个堆,但是您可以获得CRT作者可能在OS HeapAlloc之上实现的一些分配优化。

除非你想实现自定义堆管理器(你自己的一组Heap *函数),否则下载到VirtualAlloc并不会给你带来太多帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM