免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 21207 | 回复: 53
打印 上一主题 下一主题

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

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-25 13:51 |只看该作者 |正序浏览
c/c++的区别之一呀{:3_203:}

论坛徽章:
0
54 [报告]
发表于 2010-11-04 22:47 |只看该作者
回复 10# OwnWaterloo


    学习了

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
53 [报告]
发表于 2010-10-31 22:10 |只看该作者
之前面试也有问new和malloc的区别的,我也只是说new自动调用构造函数,malloc不会,之后问我还有啥不同,我说不知道。

论坛徽章:
0
52 [报告]
发表于 2010-10-30 11:14 |只看该作者
只要能用不就可以了啊

论坛徽章:
0
51 [报告]
发表于 2010-10-29 14:25 |只看该作者

论坛徽章:
0
50 [报告]
发表于 2010-10-29 13:42 |只看该作者
我, 作为一个C++ coder, 就是反感这种态度。

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



    高手 ,学习了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
49 [报告]
发表于 2010-10-29 11:31 |只看该作者
本帖最后由 OwnWaterloo 于 2010-10-29 11:33 编辑

回复 47# a1406

简单的说, 对不能处理错误的调用层次:
1. 如果不使用异常, 必须手工地检测错误, 并向上传播。
2. 如果使用异常, 可以不做任何处理, 让异常自动地向上传播。
前提是做好异常安全。
(注意, 即使不用异常, 代码依然要在出现错误的情况下作回滚, 又得手工地编写代码)


既然这帖是讨论malloc与new, 那就以内存分配为例。
假设, 一个应用程序, 对low memory的处理是这样:
1. 回滚尽可能多的未完成操作
2. 报告low memory
3. 结束进程

int main( ... )
{
      try
      {
            Main( ... );
      } catch ( std::bad_alloc& e)
      {
            cout<<"low memory, exit"<<endl;
            return -1;
      }
}

从Main开始往下, 所有的调用层次(按上面的low memory的处理策略), 按上面的low mem策略, 无须处理。
因为异常可以自动向上传播, 也无须在每个调用层次检测。
只需要保证异常安全 —— 在析构函数配合下并不难。



而如果不使用异常:
1. 每个malloc调用都必须检测
2. 然后回滚当前层次的未完成操作
3. 继续向上报告
4. 上层继续检测, 回滚, 报告 —— 报告还隐含了一点: 每个层次都和malloc有耦合了, 它们的错误里面至少有EMEM。
5. 所有这些代码, 都必须手工编写



当然, low memory是个很特殊的情况。 在low mem的情况下, 回滚操作可能不一定能完成 —— 也许回滚本身就需要请求内存。
所以上面说的是尽可能的回滚。
举malloc, 是因为大家都熟悉, 并且可以想象一下, 要达到C++的safe程度,而不是简单粗暴的if(!p) exit(1), 需要多编写多少代码?

论坛徽章:
0
48 [报告]
发表于 2010-10-29 10:12 |只看该作者
学习了,谢谢

论坛徽章:
0
47 [报告]
发表于 2010-10-29 09:49 |只看该作者
回复  starwing83

>> 那是因为Windows下面VC一家独大嘛………………接口自然是固定的。

如果是C接口 ...
OwnWaterloo 发表于 2010-10-28 14:06



    工作数年  很少去用异常     一直搞不清楚问什么要用异常   
如果是逻辑中出了错误导致的异常  那应该修改程序啊  
如果是正常的逻辑中会出现的事件导致的异常  那作为正常逻辑的一部分  使用异常是否开销太大?

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
46 [报告]
发表于 2010-10-28 17:57 |只看该作者
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP