为什么new()/ delete()比malloc()/ free()慢?
感谢目前为止的答案。如果你有感谢,请指出new()和delete()的标准C ++实现的规范!
答案 0 :(得分:25)
看看这段C代码:
struct data* pd = malloc(sizeof(struct data));
init_data(pd);
C ++中的new
运算符实际上是在完成上面的代码所做的事情。这就是它比malloc()
慢的原因。
与delete
同样如此。它正在做与此相同的事情:
deinit_data(pd);
free(pd);
如果构造函数和析构函数为空(如内置函数),new
和delete
不应慢于malloc()
和free()
。 (如果他们 ,那通常是因为常见的实现在引擎盖下调用malloc()
/ free()
,所以它们是它们的包装。包装成本。此外,可能有代码需要找出没有构造函数/析构函数被调用。这也会花费。)
修改要回答您的其他问题:
new
和delete
不是函数,它们是运算符。这个:new data()
被称为新表达式。它做了两件事。首先它调用operator new
,然后通常通过调用适当的构造函数来初始化对象。 (我说“通常”因为内置函数没有构造函数。但是一个涉及内置函数的新表达式仍然有效。)
您可以操纵这两个阶段。您可以创建自己的构造函数来操作类型的初始化,并且可以重载operator new
(即使有几个具有不同附加参数的重载,也可以特别针对每个类,如果需要),以便操纵免费存储的分配。如果您没有实现自己的operator new
,则使用标准库中的版本。这种调用的常见实现是malloc()
。
同样,如果你编写delete pd
,称为删除表达式,会发生两件事:取决于pd
,对象被解除初始化,通常是通过调用它的析构函数,然后通过调用适当的operator delete
释放内存。
同样,您可以通过编写自己的析构函数以及编写自己的operator delete
版本来操纵两个阶段。 (标准库附带的operator delete
版本通常用于调用free()
。)
答案 1 :(得分:13)
new和delete正在处理构造/销毁,其中部分工作是有效调用malloc()和free() - malloc()和free()是原始内存分配/释放。
答案 2 :(得分:4)
如果你使用它们来分配“普通旧数据”,这样构造函数/析构函数是微不足道的,那么它们与malloc
/ free
的速度相差不大。您可能(可能?)在测量中的哪个地方出错会导致结果偏差。除了调用malloc
/ free
之外,他们所做的一切都是执行类型的构造函数/析构函数(对于数组多次)。
答案 3 :(得分:4)
调用new
运算符时,会发生两件事:
因此,由于构造对象的开销,new
比malloc
慢。
同样,delete
会做两件事:
简而言之,malloc
仅分配原始内存,而new
不仅分配原始内存,还将原始内存转换为对象。
答案 4 :(得分:1)
他们不应该,而且他们不在我工作的代码库中。
在我工作的地方,malloc / free比new / delete更慢,效率更低,原因有两个: