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

Vie*_*iet 10 c++ malloc memory-management new-operator

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

编辑:

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

sbi*_*sbi 26

看看这段C代码:

struct data* pd = malloc(sizeof(struct data));
init_data(pd);
Run Code Online (Sandbox Code Playgroud)

newC++中的运算符实际上是在执行上面的代码.这就是为什么它慢于malloc().

同样地delete.它正在做相当于这个:

deinit_data(pd);
free(pd);
Run Code Online (Sandbox Code Playgroud)

如果构造函数和析构函数为空(比如内置函数),new并且delete不应该慢于malloc()free().(如果这样的话,通常是因为常见的实现调用malloc()/ free()引擎盖,所以它们是它们的包装.包装成本.此外,可能有代码需要找出没有构造函数/析构函数这也会花费.)

编辑要回答您的其他问题:

newdelete不是功能,他们是运营商.这个:new data()被称为新表达式.它做了两件事.首先它调用operator new,然后通常通过调用适当的构造函数来初始化对象.(我说"通常",因为内置函数没有构造函数.但是一个涉及内置函数的新表达式仍然有效.)

您可以操纵这两个阶段.您可以创建自己的构造函数来操作类型的初始化,并且可以重载operator new(即使有几个具有不同附加参数的重载,也特别是每个类,如果需要),以便操作免费存储的分配.如果您没有实现自己operator new的版本,则使用标准库中的版本.这个调用的常见实现malloc().

同样,如果你编写delete pd了一个叫做删除表达式的东西,就会发生两件事情:依赖于pd,对象被解除初始化,通常是通过调用它的析构函数,然后通过调用适当的方式释放内存operator delete.

同样,您可以通过编写自己的析构函数以及编写自己的版本来操纵两个阶段operator delete.(operator delete标准库附带的版本通常用于调用free().)


Lee*_*Lee 13

new和delete正在处理构造/销毁,其中部分工作是有效调用malloc()和free() - malloc()和free()是原始内存分配/释放.

  • +1例如,因为`new`和`delete`正在做与`malloc`和`free`****相同​​的工作,他们正在调用构造函数/析构函数.但是,我不认为会有很大的不同,除非真的很慢的构造函数/析构函数. (2认同)