java思维和C思维

134 阅读2分钟

先来一个C++思维的例子

/**
* 参数:二级指针,为原指针分配内存
* 返回:错误码
*/
int fun(void** pp){
    //分配内存
    *pp = malloc(sizeof(int64_t));
    if(*pp==NULL)
        return -1;
    else
        return 0;
}

void * a= NULL;
int retCode = fun(&a); //这里使用二级指针
if(retCode == 0) //0 表示成功, 非0 表示不成功,表示不同的错误码,可以通过错误码来做不同的处理
{
    
}

如果不为原来已分配内存的指针分配内存则可以不使用二级指针

再来一个同样功能的java的程序

Object fun(){
    return new Object();
}

Object obj = fun();
if(obj !=null) //null 表示不成功,非null表示成功,并且值是需要的
{
    
}

你会发现C里面可以通过错误码来做不同的错误逻辑处理,java是通过try .. catch .. finally .. 来处理

这里要顺便说下,return 会产生几次拷贝的问题。

java 作为内存管理不敏感的语言,大量的临时对象,对于C++是不可以想象的。

就以上面java中的fun为例,C程序员的写法会是怎样的呢?

if(fun()!=NULL){// 如果只是为了比较的话,这么写会减少一次拷贝
    
}

对于C/C++程序员来说,了解CPU架构等一些硬件信息还是很重要的,所以他们写的代码通常会是这样的

int64_t     a;
uint32_t    b;

而java程序员因为建立在jvm虚拟机之上,所以对硬件的关注度就没有那么高了,一切都是jvm帮你透明掉了底层,也是因为jvm内存管理对于java程序员来说不是特别的重视。java 的写法

int a;
long a;

当然如果是对数据类型不敏感的语言。比方说JS

var a =0;

哈哈,当然你所写的每一行代码都是有人替你在负重前行啊!