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的处理工作,而是选择将复杂性暴露给程序员?