前篇

都说C++难,那么C++到底难在哪里,我来说句公道话

首先,只要大家愿意学,没有克服不了的问题,还没难道学不会,不能用的地步

其次,难是相对的,相对于Java和Javascript这些语言来说,C++使用上确实是麻烦很多的,这点不可否认

语言特性不同

C++相对其它高级语言的最大的特点,就是指针和引用,资源释放

指针和指针释放,本身只能算是比较麻烦,不算难

但当一个工程变大,对象之间关系变复杂,使用的库增多,又混合多线程使用时,它真的就是一大难点了

因为此时,很多人已经很难弄清楚,别的地方会不会还在使用这个对象,别的库会不会继续调用这个对象,别的线程会不会继续调用这个对象,此时,delete掉一个指针,我们就得考虑非常多的问题

在NDK中,又继续增加了局部引用,全局引用,线程绑定等问题,又和JVM挂钩,更加麻烦

数据类型不同

这里主要指的不是语言提供的常用类型不一样

而是指,Java,Javascript这些高级语言,常用的数据类型比较少,比较完善,什么样的数据就该用什么类型

而C++开发,数据类型是在太多了,整数又各式各样的,字符串有各式各样的

类又有class和struct,栈对象和堆对象,指针和引用等区别

比如一个字符串,在Java中就是String,在Javascript中就是var,而在C++中,它可能是char*,也可能是char[],也可能是const char*,也可能是string,也可能是jstring,而且不同地方都不统一,需要转换来转换去

造成这些问题的本质,是因为C++是以字节来存储数据的,类型之间并没有明显的界限,需要自己去处理

而Java这些高级语言,则是对常见数据类型,做了强制封装和严格规范,当然也牺牲了一些性能

存储方式不同

C++的数据都是以字节来存储的,这点不仅体现在底层实现,更体现在开发方式上

做过C++的,特别是音视频,硬件通信这一块的都知道

C++中的数据,很多时候不是用class或string这些比较高级的类型去存储的

在音视频和硬件通信这块,数据经常都是以char*的格式来存储的

数组的前几个字节代表什么,后几个字节代表什么,所有数据都在存储一个字节数组里面

比如我们想获取一个整数,想要获取这个数字的长度,再取出对应的字节,再进行位运算,才能我们想要的整数

这些可能不算特别难,但至少它是繁琐的,对于代码编写和调试来说,特别麻烦

如果是在Java语言中,一个int就代表数字,一个String就代表字符串,想要调试代码,一眼就能看出来,是十分方便的,而在C++调试器中,你看到的都只是字节对应的int值,想要调试得自己写代码再观察

定位不同

Java和Javascript这些高级语言,底层也是基于C++这些底层语言来操作内存和CPU的

只是它们对字节进行了再封装,对类型进行了约束和规范,定义了一些高级类型,强制指定了这些类型的长度,存储什么样的数据

而这些约束行为,相对于直接操作内存来说,性能成本是明显增大的

所以高级语言侧重功能,底层语言侧重性能

对应的,负责的领域也有所不同,Java适合快速业务功能,而C++则适合开发音视频,硬件通信这些更注重性能的东西

大家要知道,音视频和硬件通信这些,每一秒,就可能有大批量的字节数据需要处理,如果性能有问题,会直接造成应用卡死或发烫等问题

总结

C++确实麻烦不少,但还是可以学得会的,做什么样的领域,就用什么样的语言

Java和C++是合作互补的关系,而不是竞争替代的关系

C++想要实现Java的语法特性很容易,但这不是它的使命,它的使命是开发高性能底层功能