malloc()与HeapAlloc()

TCS*_*TCS 58 c++ malloc winapi

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

那么区别是什么呢?

谢谢!

小智 78

实际上,malloc()(和其他C运行时堆函数)是模块相关的,这意味着如果从一个模块(即DLL)调用代码中的malloc(),那么你应该在同一个模块的代码中调用free()或者你可能会遭受一些非常糟糕的堆损坏(这已被很好地记录).使用HeapAlloc()和GetProcessHeap()而不是malloc(),包括重载new和delete运算符来使用它们,允许你在模块之间传递动态分配的对象,如果在代码中分配内存,则不必担心内存损坏一个模块,一旦指向内存块的指针传递到外部模块,就释放另一个模块的代码.

  • 最后,这是最重要的答案.`malloc()`是可移植的,但是当你需要移动对象和DLL时,你需要堆.对于Windows开发人员,我建议使用Heap并为Heap编写自定义STL分配器. (13认同)
  • 希望有一个指向您提到的“有据可查”的链接。 (2认同)

Dav*_*nan 51

你是对的,他们都从堆中分配内存.但是有区别:

  • malloc() 便携式,标准的一部分.
  • HeapAlloc() 不可移植,它是Windows API函数.

在Windows上,很可能会在Windows malloc之上实现HeapAlloc.我希望malloc比...更快HeapAlloc.

HeapAlloc比...有更多的灵活性malloc.特别是它允许您指定要从中分配的堆.这适用于每个进程多个堆.

对于几乎所有编码场景,您都会使用malloc而不是HeapAlloc.虽然你标记了你的问题C++,但我希望你能使用它new!

  • @drhirsh:MS在这里所做的与其他平台上发生的事情没有什么不同; malloc()很少(永远?)由OS直接提供,而是C库根据底层OS原语实现它.在Win32上,它是HeapAlloc(); 在unix上,malloc()通常用sbrk()或mmap()来实现.文件存在类似情况:C的fopen()是在Win32上的CreateFile()或unix上的open()实现的.OP的qu在这里类似于"fopen()vs open()"或"fopen()vs CreateFile()". (27认同)
  • 如果它在`HeapAlloc`之上实现,那么`malloc`怎么能比'HeapAlloc`更快? (23认同)
  • 它有一些其他目的,比如用在C或C++以外的语言中.实际上比使用C或C++的程序员更多. (8认同)
  • @ dan04因为`malloc`可以实现进一步的子分配模式. (7认同)
  • @drhirsch:"没有经验的开发人员的陷阱"肯定; "没有其他目的,"并非如此.您可以在每个线程堆中使用它,或者从可执行的堆中分配内存. (7认同)
  • `malloc`不需要进行子分配(自Win2000 SP4起); OS提供的低碎片堆(LFH)现在也可以有效地进行小分配. (3认同)
  • 正确.除了成为缺乏经验的开发人员的陷阱之外别无其他目的.通常的"我们做同样的但是给它一个其他名称来介绍一些不兼容性"的东西来自MS (2认同)

小智 24

使用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(),开销非常低.

  • HeapAlloc() 调用 ntdll.dll、kernel32.dll、kernalebase.dll 中实现的 RtlHeapAlloc() (3认同)

Che*_*Alf 6

malloc 是C标准库(以及C++标准库)中的函数.

HeapAlloc 是一个Windows API函数.

后者允许您指定要分配的堆,我认为这可以用于避免在不同线程中对分配请求进行序列化(请注意该HEAP_NO_SERIALIZE标志).

干杯&hth.,