11

我最近看到以下帖子:

内存分配器的级别不低于 malloc。(默认分配器通常直接或间接调用 malloc)

分配器只允许您指定不同的分配策略。例如,您可以使用调用 malloc 一次的分配器来检索一个大的内存池,然后对于后续的分配请求,它只返回这个池的一小块。

或者您可以将其用作挂钩,以允许您在每次分配或释放内存时执行一些额外的任务。

至于您的第二个问题, malloc 是您可以在不失去可移植性的情况下使用的最低值。malloc 通常是使用一些特定于操作系统的内存分配函数来实现的,因此它仍然是较低级别的。但这与您的主要问题无关,因为 C++ 分配器是更高级别的抽象。

来自:C++:内存分配器

我的问题是 - malloc 如何在以下操作系统中实现?

  • 适用于 Windows
  • 对于 Linux

malloc() 调用/实现的特定于操作系统的函数是什么?

4

5 回答 5

13

在 Windows 中,在 MSVC 的最新版本中,malloc(和 C++ new,因为它是使用与 的实际内存分配部分相同的基础实现的new)调用HeapAlloc()。在其他版本中,例如 g++ mingw,C 运行时是一个较旧的版本,它不会直接调用 to HeapAlloc,但在它的基础上,它仍然会HeapAlloc- 要找到不同的东西,我们需要回到Windows pre-95,它确实有一GlobalAllocLocalAlloc函数——但我认为现在人们不使用 16 位编译器——至少不是用于 Windows 编程。

在 Linux 中,如果您使用glibc,则取决于分配的大小,它是否调用sbrkmmap- mmapMAP_ANONYMOUS在标志中带有)用于更大的分配(超过阈值,我认为在典型实现中为 2MB)

于 2013-08-03T14:07:20.077 回答
4

我的问题是 - malloc 如何在以下操作系统中实现?

在 Linux 上有两个著名的malloc实现:

dlmalloc(Doug Lea 的 malloc)

ptmalloc

在像 glibc、eglibc 或 newlib 这样的 Linux libc 上实现 ptmalloc 或 ptmalloc 的变体。

malloc() 调用/实现的特定于操作系统的函数是什么?

在 Unix 和 Linux 系统sbrkmmap使用系统调用。请参阅man 2 sbrkman 2 mmap了解更多信息。

于 2013-08-03T13:49:58.487 回答
1

malloc() and friends are considered part of the runtime system that comes with a compiler. So each compiler can and does use different OS calls to implement malloc.

As others have said, on Linux the options are sbrk() and mmap().

On Windows the options are HeapAlloc() and VirtualAlloc().

于 2013-08-03T14:15:52.070 回答
1

Alright, I am not sure about Linux, but when it comes to windows...

Memory can be allocated in two categorized places.

1) Heaps (Process Heap, Custom Created Heaps) see -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366711(v=vs.85).aspx using functions like HeapAlloc & HeapFree. LocalAlloc and LocalFree can be used as 'shortcuts' to HeapAlloc when you want to allocate in the default process heap.

2) Virtual Memory (usually only process-specific due to access restrictions in global virtual memory for security), using VirtualAlloc, VirtualFree. see -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366916(v=vs.85).aspx

To my knowledge, malloc will use the heap allocation functions on windows.

I hope this helps.

于 2013-08-03T13:58:43.383 回答
0

在 Windows 上,malloc实现通常会调用 win32 堆函数,如HeapCreate, HeapDestroy, HeapAlloc, HeapFree. 这些函数将调用位于 ntdll.dll 中的 NTDLL 用户模式堆管理器,这些函数将具有RtlxxxHeap名称RtlAllocateHeap、、、RtlCreateHeap等...

最后,组内的系统调用NtxxxVirtualMemory将被调用,NtAllocateVirtualMemory, NtQueryVirtualMemory, NtFreeVirtualMemory

于 2020-10-19T13:58:25.733 回答