社区
C语言
帖子详情
请教关于new和delete的时间开销的问题。
tth
2003-10-20 10:51:50
请问new和delete的时间开销究竟有多大?
比如我作了一个链表,已经处理完毕了。先类又要做另外一个同结构的链表。我是把前一个链表每个节点都delete后,在用new重新构造一个链表好呢,还是把前一个链表那过来,直接修改里面的内容,使之变成一个新的链表好呢?
前者时间开销在new和delete上,而后者则需要函数上的开销,请问哪一种开销比较小?
...全文
832
17
打赏
收藏
请教关于new和delete的时间开销的问题。
请问new和delete的时间开销究竟有多大? 比如我作了一个链表,已经处理完毕了。先类又要做另外一个同结构的链表。我是把前一个链表每个节点都delete后,在用new重新构造一个链表好呢,还是把前一个链表那过来,直接修改里面的内容,使之变成一个新的链表好呢? 前者时间开销在new和delete上,而后者则需要函数上的开销,请问哪一种开销比较小?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
谢谢提供数据
程序员面试题
(一)c是malloc和free,c++是
new
和
delete
,区别如下: (1)
new
、
delete
是操作符,可以重载,只能在C++中使用。 (2)malloc、free是函数,可以覆盖,C、C++中都可以使用。 (3)
new
可以调用对象的构造函数,对应的
delete
调用相应的析构函数。 (4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数 (5)
new
、delet...
C/C++笔试题
1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4)系统
开销
:在创建或撤消进程时,由于系
c/c++笔试题
微软亚洲技术中心的面试题!!!1.进程和线程的差别。线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4)系统
开销
:
软件测试面试常见
问题
及答案
这里归纳总结了一些测试工程师常见的面试题,包含网络收集(完善)、个人遇到的、日常讨论等部分,总结为以下十个部分,供大家参考。如有错误的地方,欢迎指正。有更多的面试题或面试中遇到的坑,也希望补充分享。希望大家都能找到满意的工作,共勉之!
Java程序员面试题及解答(三)
二、Web篇 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。
C语言
70,012
社区成员
243,257
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章