首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >malloc()与HeapAlloc()

malloc()与HeapAlloc()
EN

Stack Overflow用户
提问于 2011-11-22 17:14:24
回答 8查看 45.4K关注 0票数 65

malloc()和HeapAlloc()有什么区别?据我所知,malloc从堆中分配内存,就像HeapAlloc一样,对吧?

那么有什么不同呢?

谢谢!

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-11-22 17:17:28

您说得对,它们都是从堆中分配内存的。但也有不同之处:

  • malloc()是可移植的,但standard.
  • HeapAlloc()的一部分不可移植,它是一个Windows API函数。

在Windows上,很有可能在HeapAlloc之上实现malloc。我预计malloc会比HeapAlloc更快。

malloc相比,HeapAlloc具有更大的灵活性。特别是,它允许您指定希望从哪个堆进行分配。这可以满足每个进程多个堆的需求。

对于几乎所有的编码场景,您都会使用malloc而不是HeapAlloc。尽管您已经将问题标记为C++,但我希望您使用的是new

票数 56
EN

Stack Overflow用户

发布于 2012-01-04 12:28:02

实际上,malloc() (和其他C运行时堆函数)是依赖于模块的,这意味着如果您在一个模块(即DLL)的代码中调用malloc(),那么您应该在同一模块的代码中调用free(),否则您可能会遭受一些非常糟糕的堆损坏(这已经有很好的文档记录了)。将HeapAlloc()与GetProcessHeap()一起使用而不是malloc(),包括重载new和delete运算符以利用这一点,允许您在模块之间传递动态分配的对象,并且不必担心在一个模块的代码中分配内存并在指向内存块的指针传递到外部模块后在另一个模块的代码中释放内存时出现内存损坏。

票数 89
EN

Stack Overflow用户

发布于 2012-04-12 01:43:48

对于Visual C++,函数malloc()或运算符new最终调用HeapAlloc()。如果调试代码,您会发现函数_heap_alloc_base() (在文件malloc.c中)正在调用return HeapAlloc(_crtheap, 0, size),其中_crtheap是使用HeapCreate()创建的全局堆。

函数HeapAlloc()在最小化内存开销方面做得很好,每次分配的内存开销最低为8字节。我见过的最大的是每次分配15个字节,分配范围从1个字节到100,000个字节。更大的块具有更大的开销,但是作为总分配的百分比,它仍然不到有效负载的2.5%。

我不能对性能发表评论,因为我没有用定制的例程对HeapAlloc()进行基准测试,但是就使用HeapAlloc()的内存开销而言,开销是惊人的低。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8224347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档