::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。
答案 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是未指定的 - 它可能会使用或不使用。