malloc()和HeapAlloc()有什么区别?据我所知,malloc从堆中分配内存,就像HeapAlloc一样,对吧?
那么有什么不同呢?
谢谢!
发布于 2011-11-22 17:17:28
您说得对,它们都是从堆中分配内存的。但也有不同之处:
malloc()是可移植的,但standard.HeapAlloc()的一部分不可移植,它是一个Windows API函数。在Windows上,很有可能在HeapAlloc之上实现malloc。我预计malloc会比HeapAlloc更快。
与malloc相比,HeapAlloc具有更大的灵活性。特别是,它允许您指定希望从哪个堆进行分配。这可以满足每个进程多个堆的需求。
对于几乎所有的编码场景,您都会使用malloc而不是HeapAlloc。尽管您已经将问题标记为C++,但我希望您使用的是new!
发布于 2012-01-04 12:28:02
实际上,malloc() (和其他C运行时堆函数)是依赖于模块的,这意味着如果您在一个模块(即DLL)的代码中调用malloc(),那么您应该在同一模块的代码中调用free(),否则您可能会遭受一些非常糟糕的堆损坏(这已经有很好的文档记录了)。将HeapAlloc()与GetProcessHeap()一起使用而不是malloc(),包括重载new和delete运算符以利用这一点,允许您在模块之间传递动态分配的对象,并且不必担心在一个模块的代码中分配内存并在指向内存块的指针传递到外部模块后在另一个模块的代码中释放内存时出现内存损坏。
发布于 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()的内存开销而言,开销是惊人的低。
https://stackoverflow.com/questions/8224347
复制相似问题