什么是从malloc()做的Windows和Linux本地操作系统/系统调用?

我最近看到以下post:

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

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

或者你可以把它作为一个钩子让你在每次分配内存或释放内存时执行一些额外的任务。

至于你的第二个问题,malloc是你可以去的最低的,而不会丢失可移植性。 malloc通常是使用一些特定于操作系统的内存分配函数来实现的 ,所以这个级别还是比较低的。 但是这与你的主要问题无关,因为C ++分配器是一个更高级别的抽象。

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

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

  • 对于Windows
  • 对于Linux

什么是特定于OS的函数被称为/实现malloc()?

Solutions Collecting From Web of "什么是从malloc()做的Windows和Linux本地操作系统/系统调用?"

在Windows中,在最近版本的MSVC中,malloc(和C ++ new ,因为它使用与new的实际内存分配部分相同的基本原理实现)调用HeapAlloc() 。 在其他的版本中,比如g ++ mingw,C运行库是一个老版本,它不直接调用HeapAlloc ,但是在它的基础上,它仍然去HeapAlloc找到不同的东西,我们需要去回到95之前的Windows,它具有GlobalAllocLocalAlloc功能 – 但我不认为人们现在使用的是16位编译器 – 至少不是Windows编程。

在Linux中,如果你使用的是glibc ,它依赖于分配的大小,无论它是调用sbrk还是mmapmmap (在标志中使用MAP_ANONYMOUS )用于更大的分配(超过阈值,我认为这是典型的2MB实现)

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

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

dlmalloc (Doug Lea的malloc)

ptmalloc

在Linux libc,如glibc,eglibc或newlib实现ptmalloc或ptmalloc的变种。

什么是特定于OS的函数被称为/ malloc()的实现?

在Unix和Linux系统上使用sbrkmmap系统调用。 有关更多信息,请参阅man 2 sbrkman 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()和朋友被认为是编译器自带的运行时系统的一部分。 所以每个编译器都可以使用不同的OS调用来实现malloc。

正如其他人所说,在Linux上,这些选项是sbrk()和mmap()。

在Windows上,选项是HeapAlloc()和VirtualAlloc()。