免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: shang2010
打印 上一主题 下一主题

求真相,new和malloc,哪个操作资源消耗更大? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-10-25 16:42 |只看该作者
大多数人都基本不使用realloc和calloc

论坛徽章:
0
12 [报告]
发表于 2010-10-27 11:32 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
13 [报告]
发表于 2010-10-27 11:35 |只看该作者
既然在用C++了,还是多用new/delete吧,与malloc区别大的一点就是一个构造析构,很符合C++的思想。

论坛徽章:
0
14 [报告]
发表于 2010-10-27 15:11 |只看该作者
记着Exceptional C++里说过,不保证new是否采用malloc实现,但是malloc一定不用new实现。

论坛徽章:
0
15 [报告]
发表于 2010-10-27 16:46 |只看该作者
这还用说啊,malloc效率更高一点呗

论坛徽章:
0
16 [报告]
发表于 2010-10-27 16:47 |只看该作者
既然在用C++了,还是多用new/delete吧,与malloc区别大的一点就是一个构造析构,很符合C++的思想。
cjaizss 发表于 2010-10-27 11:35



    虽然在用C++了,还是习惯malloc……

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
17 [报告]
发表于 2010-10-27 21:13 |只看该作者
我, 作为一个C++ coder, 就是反感这种态度。

追求新潮还玩什么C++?  玩java, .net什么的去。
玩 ...
OwnWaterloo 发表于 2010-10-25 15:15



    我不得不声明一点:new的含义在于“在堆中分配新的对象”,因为已经确定了是分配一个新的对象,所以就不可能有realloc这种东西存在(对象的大小是编译期决定的,是不变的)。顺带说一下,new是有calloc的,就是new[]。


这不是new“差”的地方,这是new自己的语义的限制,没有哪个语法比别的语法“差”,只有语义的区别。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
18 [报告]
发表于 2010-10-27 21:29 |只看该作者
回复 17# starwing83

>> 我不得不声明一点:new的含义在于“在堆中分配新的对象”,因为已经确定了是分配一个新的对象,所以就不可能有realloc这种东西存在

怎么解释 char* buf = new char[n];
如果随后的代码发现buf不够了, 怎么realloc?

no way, 必须分配新的, 释放旧的。


>> (对象的大小是编译期决定的,是不变的)。顺带说一下,new是有calloc的,就是new[]。

calloc和new[]是什么关系?
因为calloc的参数分num和size, 而malloc只有size, 所以你认为malloc是为单个对象分配, calloc是为连续对象?
不是吧你?


从程序结果来看, calloc = malloc+memset = operator new+memset = vector<max_align_t>
但calloc不一定真的需要memset。



>> 这不是new“差”的地方,这是new自己的语义的限制,没有哪个语法比别的语法“差”,只有语义的区别。
综上。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
19 [报告]
发表于 2010-10-27 21:43 |只看该作者
回复 18# OwnWaterloo


    >> >> 我不得不声明一点:new的含义在于“在堆中分配新的对象”,因为已经确定了是分配一个新的对象,所以就不可能有realloc这种东西存在
>>
>> 怎么解释 char* buf = new char[n];
>> 如果随后的代码发现buf不够了, 怎么realloc?
>>
>> no way, 必须分配新的, 释放旧的。

最近玩语言,很在乎“语义”这种东西。首先,C里面是没有真正的“可变长数组”这个东西的,就算是C99的VLA也是“一经定义不可改变”,这一点是很好的,很大地提高了效率。那么,C++里面就自然也不会有这样的东西,因此,当你写new[]的时候你实际的意思是“给我n个int对象,我不要其他的了。”这时如果你还想要多的,岂不是出尔反尔?

以前我们就争执过“语义”这个东西。我承认“语义”这个东西是十分主观的。但是,如果站在“任何语言的设计者都不是傻瓜”的角度,你自然可以各种特性都往好的、严谨的方面去想。我想这不应该算是某种失察或者恶趣味,毕竟如果你真的不行喜欢某种语言,你就不会去用它(被上级逼迫的不算)。

>> >> (对象的大小是编译期决定的,是不变的)。顺带说一下,new是有calloc的,就是new[]。
>>
>> calloc和new[]是什么关系?
>> 因为calloc的参数分num和size, 而malloc只有size, 所以你认为malloc是为单个对象分配, calloc是为连续对象?
>> 不是吧你?
>>
>>
>> 从程序结果来看, calloc = malloc+memset = operator new+memset = vector<max_align_t>
>> 但calloc不一定真的需要memset。

我的确不知道calloc会被memset。这么说calloc岂不是真的和new[]很像(memset很像构造函数,虽然基本类型的构造函数根本就不做什么事。)

另外,我们在讨论calloc,不是calloc+realloc,因此说它是vector是不合理的。

说到vector,我得说一点,上面为什么new[]不提供realloc的原因,我想就是因为vector吧,当你真的需要一个变长的数组的时候,你需要的并不是一个new[]而是一个vector,在动态规划中,一个定长的数组是十分重要的,因此你不应该说new[]不能变长就否决new[]的价值(虽然定长的东西我通常都静态数组了= =)


>> >> 这不是new“差”的地方,这是new自己的语义的限制,没有哪个语法比别的语法“差”,只有语义的区别。
>> 综上。
>>

我还是这个观念,对于一个被仔细设计的语言来说,并不应该存在一种语法比另外一种语法差。另外new是语言层面的,而malloc是库层面的。我个人觉得语言本身不应该涉及内存操作(或者至少要管就管全套嘛,何必这样管一半),但是不管怎么说,这种“大杂烩”的感觉和C++挺配的。所以这个特性也许真的有其应用价值吧。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
20 [报告]
发表于 2010-10-27 21:46 |只看该作者
顺带说一下,如果抛却主观的“语义”观念,new也的确是比较蛋疼= =
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP