C\C++和Java 的区别(特别是在内存分配方面)

 前言:今天当被问到有关C与Java之间在内存管理方面的不同是什么,瞬间 T_T__,所以特意集众人之解,存入自己的学习笔记中,加以学习和巩固。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Java和C都是指令式语言,

不同的是:

(1)Java有面向对象(OO,Object Oritended)成分在里面,而C是完全面向过程的,C的高级版本C++、C#支持面向对象。

(2)Java中采用在某个类中定义一种公用静态的变量来完成定义全局变量的功能;而不是在所有类之外定义全局变量。

(3)Java不支持头文件;而C和C++语言中都是用头文件来定义类的原型、全局变量、库函数等。

(4)Java不支持宏定义,而是使用关键字final来定义变量;而C++在采用宏定义来实现常量定义。

(5)Java中不包含结构和联合,所有内容都封装在类里面;而C和C++中结构和联合的所有成员均为公用,这就带来了安全性问题。

(6)Java中不再使用指针,既省略了指针,每个指向对象的变量其实都是指针;而指针在C和C++中却是最灵活、最易出错的数据类型。

(7)Java跨平台,既不同的操作系统都可以通过JVM(Java Virtual Machine(Java虚拟机))来解释Java程序,而C、C++、C#则是与平台(CPU+OS+Compiler)相关的,有些指令只在某些操作系统中才能执行。原因是:Java是解释型语言,所有代码都会翻译成统一的、与系统无关的bytecode,然后放到JVM上运行,而C是编译式语言,代码要先通过编译器转换成与系统相关的中间代码,然后才能运行。也可以理解为Java中,int类型总是32位的,而在C和C++中,对于不同的平台,同一个数据类型分配不同的字节数,同样是int类型,在16位的操作系统(16位的寄存器,16位的编译器)下,为2个字节既16位;在32位的操作系统(32位的寄存器、32位的编译器)下,为4个字节既32位。这使得C语言造成不可移植性,而Java具有跨平台性。

(8)Java不支持系统调用,既无法与操作系统进行交互,这是由它的跨平台的特点决定的,而C则可以调用系统中的指令,如fork()。这也是为何Java中只有线程(Thread)概念而没有进程(Process)概念,而C两者都有。

(9)在内存分配方面
       Java中对内存的分配是动态的,采用面向对象的机制,用运算符new为每个对象分配内存空间。然而Java无法对内存进行控制,也可以说实际内存会随着程序运行情况而改变。在程序运行中,每个Java系统自动对内存进行扫描,对长期不用的空间作为“垃圾”进行收集(采用Gabbage Collection机制),使得系统资源得到更充分地利用。按照这种机制,程序员不必关注内存管理问题,使得Java程序得编写变得简单明了,并且避免了由于内存管理方面的差错而导致系统出问题。而另外两个都是通过指针对内存进行人为分配的:C语言通过malloc()和free()这两个库函数来分别实现分配内在和释放内存空间;C++语言则是通过运算符new()和delete()来分配和释放内存。在C和C++的这种机制中,程序员必须非常仔细地处理内存的使用问题。一方面,如果对已释放的内存或者是未曾分配的内存做释放,都会造成死机;另一方面,若是对长期不用的或是不再使用的内存不释放,则会浪费系统资源,甚至因此造成资源枯竭。


。。。。。。


非常感谢以下贡献者:




同时也十分感谢以下扩展学习贡献者:

“C与C++动态分配,释放内存的区别”:http://wudikua123.iteye.com/blog/1517590
“32位和64位系统区别及int字节数 ” : http://blog.csdn.net/zhongzhiwei/article/details/8678885

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章