从malloc()进行的Windows和Linux本机OS /系统调用是什么?

use*_*112 8 c c++ linux windows performance

我最近看到以下帖子:

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

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

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

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

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

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

  • 对于Windows
  • 对于Linux

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

Mat*_*son 10

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

在Linux中,如果您正在使用glibc,它取决于分配的大小,无论是调用sbrk还是mmap- mmap(MAP_ANONYMOUS在标志中)用于更大的分配(超过阈值,我认为在典型实现中为2MB)


oua*_*uah 5

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

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

dlmalloc(Doug Lea 的 malloc)

ptmalloc

在 Linux 上,libc(如 glibc、eglibc 或 newlib)实现 ptmalloc 或 ptmalloc 的变体。

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

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

  • `mmap` 比 `sbrk` 更常用,后者已经过时了(即对多线程不友好)。 (2认同)