我最近看到了以下帖子:
内存分配器的级别不低于malloc。(默认分配器通常直接或间接调用malloc) 分配器仅允许您指定不同的分配策略。例如,您可以使用一个分配器,该分配器一次调用malloc来检索一个大的内存池,然后对于后续的分配请求,它仅返回该池的一小部分。 或者,您可以将其用作挂钩,以便每次分配或释放内存时都可以执行一些其他任务。 关于您的第二个问题,malloc是在不损失可移植性的前提下可以达到的最低要求。 malloc通常是使用某些特定于OS的内存分配功能实现的 ,因此仍将处于较低级别。但这与您的主要问题无关,因为C ++分配器是更高级别的抽象。
内存分配器的级别不低于malloc。(默认分配器通常直接或间接调用malloc)
分配器仅允许您指定不同的分配策略。例如,您可以使用一个分配器,该分配器一次调用malloc来检索一个大的内存池,然后对于后续的分配请求,它仅返回该池的一小部分。
或者,您可以将其用作挂钩,以便每次分配或释放内存时都可以执行一些其他任务。
关于您的第二个问题,malloc是在不损失可移植性的前提下可以达到的最低要求。 malloc通常是使用某些特定于OS的内存分配功能实现的 ,因此仍将处于较低级别。但这与您的主要问题无关,因为C ++分配器是更高级别的抽象。
我的问题是-在以下操作系统中如何实现malloc?
什么是特定于OS的函数,称为malloc()/的实现?
在Windows中,在最新版本的MSVC中,malloc(和C new,因为它使用与实际内存分配部分相同的基本原理来实现new)调用HeapAlloc()。在其他版本(例如g mingw)中,C运行时是一个较旧的版本,它的调用方式不像直接调用HeapAlloc,但是在它的基础上,它仍然指向HeapAlloc-要找到不同的地方,我们需要返回到Windows 95之前的版本确实具有GlobalAlloc和LocalAlloc函数集-但是我认为人们现在不使用16位编译器-至少不是Windows编程。
new
HeapAlloc()
HeapAlloc
GlobalAlloc
LocalAlloc
在Linux中,如果您使用glibc,则它取决于分配的大小(是调用sbrk还是mmap-- mmap(MAP_ANONYMOUS在标志中)用于更大的分配(超过阈值,我相信在典型的实现中为2MB))
glibc
sbrk
mmap
MAP_ANONYMOUS