前篇
都说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的语法特性很容易,但这不是它的使命,它的使命是开发高性能底层功能