运行原理
- C++编译型语言。源代码通过特定平台的编译器,编译成特定平台的机器码。被操作系统加载之后可以直接进行运行。
- Java,本质上是属于解释语言。是在JVM上进行执行,各个平台有对应的JVM。JVM在执行过程中,对字节码进行解释,让后上CPU运行
PS:
1.Hotspot虚拟机可以将热点代码编译成机器码。后续直接上CPU运行。但是这个也是发生在JVM内部。本质上我们的Java代码还是需要经过中间层JVM,不能直接和CPU进行交互。
2.GraalVM 可以预先编译Class文件为对应平台的机器码,此种方式就是原生的可执行程序。
对比
- 平台兼容性
C++是平台相关的,编译之后只能在对应的平台运行。如果需要换平台需要重新编译;由于JVM的原因,Java编译成Class文件之后。根据JVM规范,所有平台的JVM都可以进行加载和执行。 - 基本数据类型
C++对基本类型有标准的范围限制,但是字节长度跟具体的实现有关,同一个类型在不同的操作系统的长度可能不一样。Java在所有平台对所有的基本类型都有标准的范围限制和字节长度规定。 - 系统调用
C++可以直接进行系统库的调用;Java只能通过JNI或者JNA进行系统调用 - 面向对象
C++支持多重继承,包括虚拟继承。Java只允许单继承,需要多继承的情况下使用接口
-内存管理
C++显示分配和回收内存。Java使用垃圾回收器进行回收 - 参数传递
C++支持 指针,引用,传值调用。Java只支持值传递调用
拓展
C语言的值传递
#include <stdio.h>
void swap(int x,int y){
int tmp=x;
x=y;
y=x;
}
int main(int argc, const char * argv[]) {
int a=3;
int b=4;
swap(a,b);
printf("调用swap函数后;a=%d,b=%d\n",a,b);
return 0;
}
C语言的指针传递
#include <stdio.h>
//x y 变量是指针类型。且指向init类型的变量
void swap(int * x,int * y){
// *x表示获取x指针指向的变量。这里会发生左值转换
int tmp= *x;
// *x表示获取x指针指向的变量。*y 获取y执行的变量,这里发生左值转换
*x = *y;
*y = tmp;
}
int main(int argc, const char * argv[]) {
int a=3;
int b=4;
swap(&a,&b);
printf("调用swap函数后;a=%d,b=%d\n",a,b);
return 0;
}
c语言的指针理解
- 左值
左值是指位于赋值表达式“=”左边的值。是一个变量。 - 左值转换
当左值位于赋值表达式右边的时候,会进行转换,取变量里面存储的值。 - 指针
表示一个变量。这这个变量里面存储的是另外一个变量的地址。 - 指针变量
int * x:x 是指针变量,这个指针里面存储的是一个int变量的地址。 -
x
x是一个变量地址,是运算符,用于获取x地址所代表的变量。 - &x
获取x变量的地址。
网友评论