C++ 和 Java:区别到底在哪里

C++ 和 Java:区别到底在哪里

在做 C/C++ 开发的时候也会经常接触到 Java 相关的代码与知识,下面总结一下它们两者之间的区别:

  • 编译运行方式的区别

C++ 先将代码编译成二进制文件,这个二进制文件是和平台有关的,所以常说 C++ 不是跨平台的,操作系统将这个二进制文件读入内存执行。
Java 是将源文件 .java 编译成 .class 字节码,再通过 Jvm 将字节码载入内存中翻译执行。所以 Java 的跨平台是通过与平台无关的字节码实现的。
因为 Jvm 加载字节码后是一边翻译一边执行的,执行效率会略低于 C++,但是在硬件成本极低的现在这已经没有那么重要了。

  • 资源管理方式的区别

C++ 没有垃圾回收机制,因此 C++ 在堆上开辟了一段新空间存放数据之后还需要手动释放空间。对于一些生命周期模糊的对象,C++11 之后使用了改进版的智能指针来管理 new 出来的对象,释放空间的任务交给智能指针自动完成,整个过程使用的是 RAII 技术,感兴趣的朋友可以参考上一篇智能指针的文章。
Java 中有垃圾回收机制,堆中申请的空间 GC 会自动回收,而 Java 没有析构函数,也几乎很少用 RAII 来管理资源。

  • 错误处理方式的区别

C++ 出于历史原因(Google 编码风格)或是性能原因(异常抛出时系统实时性受损)可以不使用异常,因为如果使用异常,代码中可能出现大量的 try{...}catch{...} 语句,代码将会变得冗长难读,而且在泛型编程的代码中我们甚至不知道可能会出现哪些异常
所以 C++17 之后,C++ 对异常的处理标准变成了我们只能声明某些函数不能抛出异常。在运行之前,无论是代码声明还是编译器都不能发现异常。
Java 中如果一个函数抛出异常,则强制它的调用方必须要处理异常。

  • 变量语义的区别

C++ 中所有的变量缺省都是值语义,如果不使用指针或者引用,变量不会引用一个堆上的对象。
值语义的生命周期管理简单,因为它们都是 stack object,但是通过指针或引用来操作堆上对象的时候,C++ 就需要考虑所指对象是否成功释放。智能指针能够将引用语义转化为值语义来解决上述对象生命周期的问题。由于 memory localityC++ 的值语义在性能上具有极大的优势。
Java 中大部分变量则是引用语义,栈空间的变量都是引用类型,因此如果发生拷贝都是浅拷贝。

  • 申请对象方式的区别

变量语义的区别带来了申请对象方式的区别。
C++ 可以自由控制对象是在堆上分配还是在栈上分配,堆上分配时间不确定,而栈上分配速度极快。
Java 提倡所有对象都在堆上分配(原生类型也有对应的封装类),由 GC 统一管理对象生命周期。

  • 对外暴露接口的区别

C++ 除了模板类需要将接口和实现都放在头文件中,其他情况下都是头文件提供对外接口,源文件实现对外接口
Java 主要是通过继承和多态来实现自定义接口。

  • 引用外部类与依赖关系的区别

C++ 的头文件机制会引入大量不相关的代码依赖,编译过程中经常出现某个依赖的头文件不匹配,但是却找不到是如何使用这个头文件的,同样的,链接时也会出现库版本不对或者库的编译参数不匹配等错误。
Javaimport 机制以及 package 机制能够很好地解决上面的问题,用到哪个类就 import 哪个类,用到的库文件也能够编译成一个 .jar 包用于外部 import,简单高效。

  • 编程范式的区别

C++ 是一门多范式的编程语言,支持面向过程编程、面向对象编程、泛型编程、函数式编程,开发灵活性高。
Java 支持面向对象编程,或许还有泛型?

以上,JavaC++ 相比,社区更加活跃,工具也更加丰富,开源库也多,难怪在讲究速度与效率的互联网行业如此受欢迎。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值