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

时间:2016-01-15 14:37:58

标签: c++ malloc new-operator dynamic-memory-allocation

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

this answer中它说:

  保证

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

这表明new()无法调用malloc()

注意:operator new所有SELECT m.id, q1.`question_name`, q2.`question_name` FROM `mutual` m INNER JOIN `Question` q1 ON q1.`id` = m.`question_id_1` INNER JOIN `Question` q2 ON q2.`id` = m.`question_id_2` 其他而不是分配的所有内容question

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:3)

它可以,通常也可以 在Windows上(更具体地说,在VC ++上),调用链看起来像

operator new致电malloc来电HeapAlloc

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

不,没有义务调用malloc。由图书馆开发人员/最终用户开发人员决定他们希望从哪里获取内存。

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

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

(所有这些approches很少完成,从我的经验来看,它们给执行时间带来了极少的改进)

答案 2 :(得分:2)

是的,它可以调用malloc - 在带有VS的Windows和标准运行时库下调用malloc

您可以重载新运算符并调用自己的分配函数。在我工作的应用程序中,我们有来自Doug Lea的自定义malloc,其中包含许多用于嵌入式系统的自定义。 Windows调用malloc是因为它调用了HeapAlloc,它是windows下的标准堆分配函数。它还允许使用CrtDbg api调试分配错误。

为了使答案更正式,我已经查阅了标准,在§18.6.1.1中,我发现new

  

执行循环:在循环内,函数首先尝试   分配请求的存储空间。 尝试是否涉及到电话   标准C库函数malloc未指定

所以使用malloc是未指定的 - 它可能会使用或不使用。