我最近看到了以下帖子:
内存分配器的级别不低于malloc。(默认值分配器通常直接或间接调用malloc)
分配器只允许您指定不同的分配战略。例如,您可以使用一个分配器来调用malloc一次用于检索大的内存池,然后用于后续分配请求,它只返回这个池的一小部分。
或者,您可以将其用作挂钩,以便执行一些附加操作任务。
至于你的第二个问题,malloc是你可以不用的最低的失去可移植性malloc通常使用操作系统特定的内存分配功能,因此级别较低还但这与你的主要问题无关,因为C++分配器是一个更高级的抽象。
来自:C++:内存分配器
我的问题是,malloc是如何在以下操作系统中实现的?
- 适用于Windows
- 适用于Linux
malloc()的操作系统特定函数是什么?
在Windows中,在最新版本的MSVC中,malloc(和C++new
,因为它是使用与new
的实际内存分配部分相同的基本原理实现的)调用HeapAlloc()
。在其他版本中,如g++mingw,C运行时是一个较旧的版本,它不会直接调用HeapAlloc
,但在它的基础上,它仍然会调用HeapAlloc
-要找到不同的东西,我们需要回到Windows 95之前,它确实有一组GlobalAlloc
和LocalAlloc
函数-但我认为现在人们不使用16位编译器-至少不用于Windows编程。
在Linux中,如果您使用glibc
,它取决于分配的大小,它是调用sbrk
还是mmap
-mmap
(标志中有MAP_ANONYMOUS
)用于更大的分配(超过阈值,我认为在典型实现中是2MB)
我的问题是,malloc是如何在以下操作系统中实现的?
在Linux上有两个著名的malloc
实现:
dlmalloc(Doug Lea的malloc)
ptmalloc
在像glibc这样的Linux libc上,eglibc或newlib实现ptmalloc或ptmalloc的变体。
malloc()的操作系统特定函数是什么?
在Unix和Linux系统上,使用sbrk
和mmap
系统调用。有关详细信息,请参见man 2 sbrk
和man 2 mmap
。
好吧,我不确定Linux,但当谈到windows时。。。
内存可以分为两类。
1) 堆(处理堆、自定义创建堆)请参阅->http://msdn.microsoft.com/en-us/library/windows/desktop/aa366711(v=vs.85).aspx使用诸如HeapAlloc&HeapFree。当您想在默认进程堆中进行分配时,LocalAlloc和LocalFree可以用作HeapAlloc的"快捷方式"。
2) 虚拟内存(通常仅针对特定进程,因为出于安全考虑,全局虚拟内存中存在访问限制),使用VirtualAlloc、VirtualFree。请参阅->http://msdn.microsoft.com/en-us/library/windows/desktop/aa366916(v=vs.85).aspx
据我所知,malloc将在windows上使用堆分配函数。
我希望这能有所帮助。
malloc()和朋友被认为是编译器附带的运行时系统的一部分。因此,每个编译器都可以而且确实使用不同的操作系统调用来实现malloc。
正如其他人所说,在Linux上,选项是sbrk()和mmap()。
在Windows上,选项为HeapAlloc()和VirtualAlloc(。
在Windows上,malloc
实现通常会调用win32堆函数,如HeapCreate
、HeapDestroy
、HeapAlloc
、HeapFree
。这些函数将调用位于NTDLL.dll中的NTDLL用户模式堆管理器,这些函数将具有RtlxxxHeap
名称、RtlAllocateHeap
、RtlCreateHeap
等
最终,将调用NtxxxVirtualMemory
组内的系统调用,NtAllocateVirtualMemory
、NtQueryVirtualMemory
、NtFreeVirtualMemory
。