换句话说,每次调用它时是否会进行malloc()
系统调用? (可能提前分配了一大块)
答案 0 :(得分:1)
在C ++ 14之前,该标准禁止实现组合分配。因此,每个new
表达式都与一些系统分配函数(可能是malloc
)一对一地对应。
C ++ 14 relaxed this restriction。现在,如果一个的生命周期严格地在另一个的生命周期内,则实现可以组合分配。这是一个相当狭窄的限制,所以我希望分配实际上不会经常合并。
答案 1 :(得分:0)
换句话说,每次调用它时是否会进行
malloc()
系统调用?
它实际上是实现依赖的。但通常new
的实现将使用malloc()
系统调用/ c-library绑定。
(可能提前分配了一大块)
是的,你必须考虑到这是一个缺点。经常打电话给
char* newChar = new char();
可能会在分配更大的块时不必要地混乱您的动态存储空间,而不是单个char
所需的。
如果要覆盖该行为以进行更有效的内存管理,可以始终使用placement new
。
答案 2 :(得分:0)
正如其他人所说,这是实施定义。但是,我认为高性能C ++实现可能不会使用malloc(),而是使用特定于操作系统的内存分配API或系统调用(malloc()必须自己使用)。毕竟,为什么要为每个内存分配添加额外的函数调用?但我没有确凿证据证明这一点。