为什么new()/ delete()比malloc()/ free()慢?

时间:2010-04-03 07:31:22

标签: c++ memory-management malloc new-operator

为什么new()/ delete()比malloc()/ free()慢?

编辑:

感谢目前为止的答案。如果你有感谢,请指出new()和delete()的标准C ++实现的规范!

5 个答案:

答案 0 :(得分:25)

看看这段C代码:

struct data* pd = malloc(sizeof(struct data));
init_data(pd);

C ++中的new运算符实际上是在完成上面的代码所做的事情。这就是它比malloc()慢的原因。

delete同样如此。它正在做与此相同的事情:

deinit_data(pd);
free(pd);

如果构造函数和析构函数为空(如内置函数),newdelete不应慢于malloc()free()。 (如果他们 ,那通常是因为常见的实现在引擎盖下调用malloc() / free(),所以它们是它们的包装。包装成本。此外,可能有代码需要找出没有构造函数/析构函数被调用。这也会花费。)

修改要回答您的其他问题:

newdelete不是函数,它们是运算符。这个: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运算符时,会发生两件事:

  1. 为堆上的对象分配内存。
  2. 调用对象的构造函数。
  3. 因此,由于构造对象的开销,newmalloc慢。

    同样,delete会做两件事:

    1. 调用堆对象的析构函数。
    2. 释放对象的内存。
    3. 简而言之,malloc仅分配原始内存,而new不仅分配原始内存,还将原始内存转换为对象。

答案 4 :(得分:1)

他们不应该,而且他们不在我工作的代码库中。

在我工作的地方,malloc / free比new / delete更慢,效率更低,原因有两个:

  • free()不知道对象的大小,而delete在编译时通常具有此大小。
  • malloc()不知道它正在分配的对象的类型,因此它必须始终提供16字节对齐的内存。这往往是浪费。