我看C++与Java

 

 

Java所有的对象在heap上分配,所有的变量都是引用(primitive type除外),所有的对象内存由GC管理。这样设计的结果就是:Java中的变量的赋值(包括method传参和返回值)、对象的copy,都非常简单。

 

C++的复杂性:

1)C++的对象除了在heap上分配,还可以在stack和non-local scope上分配,导致对象赋值极其复杂。其引起的复杂性有:类的assignment constructor/copy constructor。C++11新增了move constructor,附带有std::move(), 右值引用,更进一步,有通用引用和std::forward()。这些语法本质上都是让程序员自己来管理内存。

2)C++的函数传参也非常令人头痛,有const/volatile等modifier,造成编码时不必要的麻烦。

 

所以C++11/14语言上的复杂性,有很大一部分就是为了让程序员更深度地参与对象的内存管理。所以C++11/14看似很高级,其实只是麻布袋上绣花,补丁上打补丁。

C++缺省的赋值效率非常低下。以函数返回一个临时对象为例,会产生多个临时对象,产生多次赋值(move constructor就是为了改善这种低效)。但我有一个疑问,对于右值(表达式的结果/函数返回值)这样的临时对象,为何C++ Compiler不能自动进行move constructor的处理工作,而是选择将复杂性暴露给程序员?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值