:: operator new(size_t)是否使用malloc()?

ein*_*ica 12 c++ malloc new-operator dynamic-memory-allocation

是在内部::operator new(size_t)调用malloc(),还是直接使用系统调用/特定于操作系统的库调用?C++标准说什么?

这个答案中它说:

malloc()保证返回与任何标准类型对齐的地址.::operator new(n)只保证返回一个不大于任何标准类型的地址n,如果T不是一个字符类型,那么new T[n]只需要返回一个对齐的地址T.

这表明new()不需要打电话malloc().

注意:这里有一个SO 问题有关的一切operator new其他比分配.

Ser*_*eyA 17

如何operator new实现的细节是标准库的特定实现的属性 - 甚至不是编译器或操作系统.我熟悉一个(gnu)并且知道其他3个人--CLang,Apache和MSFT.所有这些都malloc()在内部使用operator new,因为它只是使图书馆开发人员的生活变得更加容易.

如果malloc()没有使用,那么开发人员将不得不在内存分配方面重新实现很多,并且将代码大量使用依赖于操作系统的逻辑来实际请求内存.malloc()已经存在的时候,没有人愿意这样做.但绝不是他们有义务使用它.


Dav*_*aim 5

它可以,而且通常如此。
在 Windows 上(更具体地说是在 VC++ 上),调用链看起来像

operator new来电malloc来电HeapAlloc

HeapAlloc是一个 Windows API 函数,用于从特定堆分配内存。当进程启动时,它会分配一个堆(CRT 堆),其中所有标准分配都会占用内存。

不,它没有义务调用 malloc。由库开发人员/最终用户开发人员决定他们想要从哪里获取内存。

例如,我可以创建一个单线程程序。通常,堆分配器在分配/释放发生时锁定堆锁,以防止堆上出现致命的竞争条件。但如果我的程序是单线程的,我就没有问题。
我可以选择使用 WinApi 创建自己的堆HeapCreate并传递HEAP_NO_SERIALIZE,这使得堆跳过锁定。然后我可以使用operator newplain HeapAlloc。在这种情况下,我可以new使用不同的功能进行工作malloc

另一种有时*采用的低级方法是使用 分配巨大的内存块VirtualAlloc,然后在有人调用时传递重新计算的内存地址new

(所有这些方法都很少执行,根据我的经验,它们对执行时间的改进微乎其微)