请教关于new和delete的时间开销的问题。

tth 2003-10-20 10:51:50
请问new和delete的时间开销究竟有多大?

比如我作了一个链表,已经处理完毕了。先类又要做另外一个同结构的链表。我是把前一个链表每个节点都delete后,在用new重新构造一个链表好呢,还是把前一个链表那过来,直接修改里面的内容,使之变成一个新的链表好呢?
前者时间开销在new和delete上,而后者则需要函数上的开销,请问哪一种开销比较小?
...全文
677 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wingfiring 2003-11-04
  • 打赏
  • 举报
回复
首先,申请不同的内存块,在一个内存块内部,只存放同样大小的对象。然后,把每一块空闲的内存串成链表。
当分配对象的时候,只要在符合这个对象大小的内存块上取一块出来就可以了,所有的操作,就是修改一下链表的相关地址,这个操作只是几条机器指令。归还也是一样。
对象的大小是编译期间就知道的,因此,需要设法在编译期间就确定从那个块上取数据。
另外,还要能够对程序员透明。我曾经尝试写这么一个东西,但遇到了一些问题:如何在类定义外部重载模版化的new/delete运算符的问题,我只能在new()/delete()上实现,实在是郁闷。

tth 2003-10-26
  • 打赏
  • 举报
回复
能不能请wingfiring(别逗了)谈得具体一点。
是不是需要设计一个memory pool的基类,然后把自己的类从memory pool继承下来?这一点在effective中没有讲清楚。
wingfiring 2003-10-26
  • 打赏
  • 举报
回复
如果以模板的方式重载new/delete,模板参数就是sizeof(type),那么就有可能实现自动化的memory pool,这个技术适用于几乎所有的类,每个new/delete的开销甚至比函数调用还低,因为模板可以是inline的。但是这个技术只能用来分配单个对象,没办法处理数组。
killme2008 2003-10-25
  • 打赏
  • 举报
回复
同意楼上的,绝对经典
kxw 2003-10-24
  • 打赏
  • 举报
回复
我就觉得effective c++那书经典,学了不少东西。
wenjhua 2003-10-24
  • 打赏
  • 举报
回复
应该是new 的开销比delete 的大

到底有多大要看你声明的变量类型

至于,new 跟malloc
delete与free 哪个更节省开销就不知道的说

个人推崇用c++的堆操作new 和delete ,总觉得比c 方便的多
Wolf0403 2003-10-24
  • 打赏
  • 举报
回复
其实 Memory pool 是不是就是对系统分配内存的一个“二次缓冲”? stl 的 std::allocator 应该也可以吧
tth 2003-10-24
  • 打赏
  • 举报
回复
多谢wingfiring(别逗了)
我找到解决new和delete带来的瓶颈的方法了,在Effective C++中有关于Memory Pool的介绍。大致意思就是先开辟一块较大的内存,然后重载new和delete,用一个Memory Pool类对开辟的内存进行管理,有兴趣的可以去查一下《Effective C++》的条款10。
langzi8818 2003-10-21
  • 打赏
  • 举报
回复
我想函数直接用就好了,因为new和delete都是函数调用啊,
wingfiring 2003-10-21
  • 打赏
  • 举报
回复
说明一下,测试的时候我的机器配置是C 1G,win2k Pro sp3, VC6.0
wingfiring 2003-10-20
  • 打赏
  • 举报
回复
我曾经在自己的机器上作过一个测试,分配的对象都是int:
new的开销一般为400~500时钟周期。delete一般为70左右。
new/delete和malloc/free的开销基本一致。

而函数调用的开销只是几个时钟周期。总的来说,内存分配是一个开销巨大的操作,如果存在密集的内存分配操作,将很可能成为性能瓶颈。
tth 2003-10-20
  • 打赏
  • 举报
回复
有没有细致一点的比较,比如说delete一块内存大致相当于什么操作的时间开销?
sizhi 2003-10-20
  • 打赏
  • 举报
回复
new 主要是初始化和malloc(),函数开销不可以省的
hungta 2003-10-20
  • 打赏
  • 举报
回复
我的理解是最好不用频繁new/delete,因为这肯定要费时间,而且会产生内存碎片,对高性能的程序不利,尤其长时间在线之类的程序。
smans 2003-10-20
  • 打赏
  • 举报
回复
前者需要对内存进行管理,撤销链表的内存,如果能改的话,那还是后者划算.
limd 2003-10-20
  • 打赏
  • 举报
回复
能直接改,就直接改吧
qufan 2003-10-20
  • 打赏
  • 举报
回复
谢谢提供数据

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧