随笔 - 30, 文章 - 0, 评论 - 64, 引用 - 0
数据加载中……

从Java到C++ — 对比Java与C++编程的不同

1. 数据类型和变量

C++ 中的变量类型与Java很相似。像Java一样,C++ 有intdouble 类型。但是这些数字类型的取值范围是依赖于机器的。比如在16位系统上,例如运行DOS 或Windows 3.x的PC机上,int 是双字节(2-byte)的,取值范围比Java的4-byte的int 要小很多。在这些机器上,如果 int 不够用的话,你需要使用长整型long。

C++ 有 shortunsigned 类型来更有效的存储数字。(我认为所谓有效是指更高的空间利用率。) 最好是尽量避免使用这些类型除非是空间利用的有效性对你的系统真的非常重要。

在C++中布尔型用 bool 表示,而不像在Java中用boolean。

C++ 中字符串类型用 string 表示。它与Java中的 String 类型非常相似,但是,还是要逐一以下几点不同之处:

1. C++ 字符串存储ASCII 码字符,而不是标准码Unicode 字符

2. C++ 字符串是可以被修改的,而Java字符串的内容是不可修改的(immutable)。

3. 取子字符串的操作在 C++ 中叫做 substr,这个命令s.substr(i, n) 从字符串s中取得从位置 i 开始长度为n的子字符串。

4. 在C++中,你只能够将字符串与其它字符串对象相串联(concatenate),而不能够与任意的对象相串联。

5. C++中可以直接使用关系操作符 ==、 !=、 <、 <=、 >、 >= 来进行字符串比较,其中后面四个操作符是按字母顺序进行比较的。 这比Java中使用函数equals和compareTo来比较要方便很多。



2. 变量和常量

在C++中,本地变量的定义看起来与Java中相同,例如:

int n = 5;

实际上这正是C++和Java的一个重要不同之处。C++编译器不对本地变量进行初始化检验,所以在C++中很容易忘记初始化一个变量,这种情况下,变量的值该变量所占内存区域中刚好当前存在随机值。这显然是很容易产生程序出错的地方。

与Java一样, C++中类可以有数据域和静态变量。不同的是,C++中变量可以在函数甚至是类的外面定义,这些所谓的全局变量可以在程序的任何函数中被访问,因而不易被很好的管理。所C++中应该尽量避免使用全局变量。

在C++中,常量可以在任何地方被定义(记得在Java中,常量必须是类的静态数据static data)。 C++ 使用关键字 const 来定义常量,而Java中是 final。例如:

const int DAYS_PER_YEAR = 365;




3. 类

C++ 中对类的定义与Java有些不同,这里是一个例子:一个C++ 版本的 Point 类:

class Point /* C++ */

{

public:

Point();

Point(double xval, double yval);

void move(double dx, double dy);

double getX() const;

double getY() const;

private:

double x;

double y;

};

这里几点重要的不同是:

1. C++的类定义中分为公共和私有部分,分别以关键字 publicprivate开始。而在Java中,每一个元素都必须标明 publicprivate

2. C++中类的定义只包含函数的声明,真正的实现另外单独列出。

3. 访问函数(accessor methods)标有关键字 const ,表明这个函数不会改变本对象的元素值。

4. 类定义的结尾处有分号

类中函数的实现跟在类的定义之后。因为函数是在类外面定义的,所以每一个函数的名字前面要加类名称作为前缀,并使用操作符双冒号::来分割类的名称和函数的名称。不改变隐含参数值(即当前对象的值)的访问函数用 const标明。如下所示是上面类定义中的函数的实现:

Point::Point() { x = 0; y = 0; }

void Point::move(double dx, double dy)

{

x = x + dx;

y = y + dy;

}

double Point::getX() const

{

return x;

}




4. 对象

Java 与 C++ 最主要的不同在于对象变量的使用。在 C++中,对象变量存储的是真正的对象的值,而不是对象引用(reference)。注意在C++中构造一个对象的时候是不使用关键字new的,只需要在变量的名字后面直接赋予构造函数的参数就可以了,例如:

Point p(1, 2); /* 构造对象 p */

如果不跟参数赋值,则使用默认构造函数,例如:

Time now; /* 默认使用构造函数 Time::Time() */

这一点与Java很不同。在Java中,这个命令仅仅生成一个没有初始化的reference,而在C++中,它生成一个实际的对象。

当一个对象被赋给另一个对象变量的时候,实际的值将被拷贝。而在Java中,拷贝一个对象变量只不过是建立了另外一个指向对象的reference。拷贝一个C++的对象就像在Java中调用clone这个函数一样,而修改拷贝的值不会改变原对象的值。例如:

Point q = p; /* 拷贝p到q */

q.move(1, 1); /* 移动q而p不动,即q的值变了,而p的不变*/

多数情况下,C++中这种对象直接对值操作的特性使用起来很方便,但是也有些时候不尽如人意:

1. 当需要一个函数中修改一个对象的值,必须记住要使用按引用调用call by reference (参见下面函数部分)

2. 两个对象变量不能指向同一个对象实体。如果你要在C++中实现这种效果,必须使用指针pointer(参见下面指针部分)

3. 一个对象变量只能存储一种特定的类型的值,如果你想要使用一个变量来存储不同子类的对象的值(多态ploymorphism),则需要使用指针。

4. 如果你想在C++中使用一个变量来或者指向null或者指向一个实际的对象,则需要使用指针






5. 函数

在Java中,每一个函数必须或者是对象函数(instance method),或者是静态函数(static function)或称类函数。C++同样支持对象函数和静态函数(类函数),但同时C++也允许定义不属于任何类的函数,这些函数叫做全局函数(global functions)

特别的是,每一个C++ 程序都从一个叫做 main的全局函数开始执行:

int main()

{ . . .

}

还有另外一个格式的main函数可以用来捕捉命令行参数,类似于Java的main函数,但是它要求关于C格式的数组和字符串的知识,这里就不介绍了。

按照习惯,通常如果程序执行成功, main 函数返回0,否则返回非零整数。

同Java一样,函数参数是通过值传递的(passed by value)。在Java中,函数无论如何都是可以修改对象的值的。然而在C++中,因为对象直接存储的是实际的值,而不是指向值的reference,也就是说传入函数的是一个实际值的拷贝,因此也就无法修改原来对象的值。

所以,C++ 有两种参数传递机制,同Java一样的按值调用(call by value) ,以及按地址调用(call by reference)。当一个参数是按reference传递时,函数可以修改其原始值。Call by reference 的参数前面有一个地址号 & 跟在参数类型的后面,例如:

void raiseSalary(Employee& e, double by)

{ . . .

}

下面是一个典型的利用call by reference的函数,在Java中是无法实现这样的功能的。

void swap(int& a, int& b)

{ int temp = a;

a = b;

b = temp;

}

如果使用 swap(x, y)来调用这个函数,则reference参数 ab 指向原实际参数xy的位置,而不是它们的值的拷贝,因此这个函数可以实现实际交换这两个参数的值。

在 C++中,每当需要实现修改原参数的值时你就可以使用按地址调用 call by reference




6. 向量Vector

C++ 的向量结构结合了Java中数组和向量两者的优点。一个C++ 的向量可以方便的被访问,其容量又可以动态的增长。如果 T 是任意类型,则 vector<T> 是一个元素为 T 类型的动态数组。下面的语句

vector<int> a;

产生一个初始为空的向量。而语句

vector<int> a(100);

生成一个初始有100个元素的向量。你可以使用push_back 函数来添加元素:

a.push_back(n);

调用 a.pop_back()a中取出最后一个元素(操作后这个元素被从a中删掉), 使用函数size 可以得到当前a中的元素个数。

你还可以通过我们熟悉的 [] 操作符来访问向量中元素,例如:

for (i = 0; i < a.size(); i++) {

sum = sum + a[i];

}

同Java中一样,数组索引必须为 0 和 a.size() - 1之间的值。但是与Java不同的是,C++中没有runtime的索引号合法性检验。试图访问非法的索引位置可能造成非常严重的出错。

就像所有其它 C++ 对象一样,向量也是值。如果你将一个向量赋值给另外一个向量变量,所有的元素都会被拷贝过去。

vector<int> b = a; /* 所有的元素都被拷贝了 */

对比Java中的情况,在Java中,一个数组变量是一个指向数组的reference。拷贝这个变量仅仅产生另外一个指向同一数组的reference,而不会拷贝每一个元素的值。

正因如此,如果一个C++函数要实现修改向量的值,必须使用reference参数:

void sort(vector<int>& a)

{ . . .

}




7. 输入和输出

在C++中,标准的输入输出流用对象 cincout 表示。我们使用 << 操作符写输出,例如:

cout << “Hello, World!”;

也可以连着输出多项内容,例如:

cout << “The answer is ” << x << “\n”;

我们使用 >> 操作符来读入一个数字或单词,例如:

double x;

cout << “Please enter x: “;

cin >> x;

string fname;

cout << “Please enter your first name: “;

cin >> fname;

函数getline 可以读入整行的输入,例如:

string inputLine;

getline(cin, inputLine);

如果到达输入的结尾,或者一个数字无法被正确的读入,这个流对象会被设置为 failed 状态,我们可以使用函数 fail 来检验这个状态,例如:

int n;

cin >> n;

if (cin.fail()) cout << “Bad input”;

一旦一个流的状态被设为failed,我们是很难重置它的状态的,所以如果你的程序需要处理错误输入的情况,应该使用函数 getline 然后人工处理得到的输入数据。

 

 



8. 指针pointer

我们已经知道在C++中,对象变量直接存储的是对象的值。这是与Java不同的,在Java中对象变量存储的是一个地址,该地址指向对象值实际存储的地方。有时在C++中也需要实现这样的布置,这就用到了指针pointer。在 C++中,一个指向对象的变量叫做指针。如果T是一种数据类型,则 T* 是指向这种数据类型的指针。

就像 Java中一样,一个指针变量可以被初始化为空值 NULL,另外一个指针变量的值,或者一个调用new生成的新对象:

Employee* p = NULL;

Employee* q = new Employee(”Hacker, Harry”, 35000);

Employee* r = q;

实际上在C++中还有第四种可能,那就是指针可以被初始化为另外一个对象的地址,这需要使用地址操作符 &

Employee boss(”Morris, Melinda”, 83000);

Employee* s = &boss;

这实际上并不是什么好主意。保险的做法还是应该直接让指针指向使用 new生成的新对象。

到目前为止,C++ 指针看起来非常像 Java 的对象变量。然而,这里有一个很重要的语法的不同。我们必须使用星号操作符 * 来访问指针指向的对象。如果 p 是一个指向Employee对象的指针,则 *p 才代表了这个对象:

Employee* p = . . .;

Employee boss = *p;

当我们需要执行对象的函数或访问对象的一个数据域时,也需要使用 *p

(*p).setSalary(91000);

*p外面的括号是必需的,因为 . 操作符比 * 操作符有更高的优先级。C的设计者觉得这种写法很难看,所以他们提供了另外一种替代的写法,使用 -> 操作符来实现 *. 操作符的组合功能。表达式

p->setSalary(91000);

可以调用对象*p的函数 setSalary 。你可以简单的记住 . 操作符是在对象上使用的,-> 操作符是在指针上使用的。

如果你不初始化一个指针,或者如果一个指针为空值 NULL 或指向的对象不再存在,则在它上面使用 *-> 操作符就会出错。 不幸的是 C++ runtime 系统并不检查这个出错。如果你范了这个错误,你的程序可能会行为古怪或死机。

而在Java中,这些错误是不会发生的。所有的reference都必须初始化,所有的对象只要仍有reference指向它就不会被从内存中清除,因此你也不会有一个指向已被删除的对象的reference。Java的runtime 系统会检查reference是否为空,并在遇到空指针时抛出一个null pointer的例外(exception)。

C++ 和 Java还有一个显著的不同,就是 Java 有垃圾回收功能,能够自动回收被废弃的对象。而在C++中,需要程序员自己管理内存分配回收。

C++中当对象变量超出范围时可以自动被回收。但是使用new生成的对象必须用delete操作符手动删除,例如:

Employee* p = new Employee(”Hacker, Harry”, 38000);

. . .

delete p; /* 不在需要这个对象 */

如果你忘记删除一个对象,那么你的程序有可能最终用光所有内存。这就是我们常说的内存泄漏 (memory leak)。更重要的是,如果你如果删除了一个对象,然后又继续使用它,你可能覆盖不属于你的数据。如果你刚巧覆盖了用于处理内存回收的数据域,那么内存分配机制就可能运转失常而造成更严重的错误,而且很难诊断和修复。因此,在C++中最好尽量少用指针




9. 继承

C++和Java中继承的基本语法是很相似的。在C++中,使用 : public 代替Java中的extends 来表示继承关系 。 (C++ 也支持私有继承的概念,但是不太有用。)

默认情况下,C++中的函数不是动态绑定的。如果你需要某个函数实现动态绑定,需要使用virtual声明它为虚函数,例如:

class Manager : public Employee

{

public:

Manager(string name, double salary, string dept);

virtual void print() const;

private:

string department;

};

同Java一样,构造函数中调用父类的构造函数有特殊的语法。 Java使用关键字 super。C++中必须在子类的构造函数体外调用父类的构造函数。下面是一个例子:

Manager::Manager(string name, double salary, string dept)

: Employee(name, salary) /* 调用父类的构造函数 */

{ department = dept;

}

Java 中在子类函数中调用父类的函数时也使用关键字 super 。而在C++中是使用父类的名称加上操作符 ::表示,例如:

void Manager::print() const

{ Employee::print(); /* 调用父类的函数 */

cout << department << “\n”;

}

一个 C++ 对象变量只能存储特定类型的对象值。要想在C++中实现多态(polymorphism),必须使用指针。一个 T* 指针可以指向类型为 TT 的任意子类的对象,例如:

Employee* e = new Manager(”Morris, Melinda”, 83000, “Finance”);

你可以将父类和不同子类的对象混合收集到一个元素均为指针的向量中,然后调用动态绑定的函数,如下所示:

vector<Employee*> staff;

. . .

for (i = 0; i < staff.size(); i++)

staff[i]->print();

posted on 2008-12-09 13:43 henry08 阅读(4235) 评论(32)  编辑 收藏 引用 所属分类: C++

评论

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

"C++ 中的变量类型与Java很相似。像Java一样,C++ 有int 和 double 类型。"
这句若能改成
"Java中的变量类型与C++ 很相似。像C++ 一样,Java 有int 和 double 类型。"

就好像我们会说这个新来的和过去的那个一样
2008-12-09 15:40 | doyle

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

一直都不屑于java
1、名词,概念太多,实际上唬人而已,花架子;
2、效率实在太差了;
3、用来做快餐的东西,会是好东西吗;
4、写java程序员的能力,真的有待提高,知识很表面化,和C++程序员相差实在太远了。
2008-12-09 16:31 | 我也写java

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

1. C++ 字符串存储ASCII 码字符,而不是标准码Unicode 字符

2. C++ 字符串是可以被修改的,而Java字符串的内容是不可修改的(immutable)。
========================
字符串是什么?这在C++的眼里,只不过是一片连续的内存,且这片内存可以跨任何平台;在java眼里,是ASICC,UTF-8,UTF-16这种编码构成的某种神秘物体。
这就是差别,叫差距行不行?我看行。
2008-12-09 16:39 | 我也写java

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

JAVA写多了,能力会退化的。
我以前写了6年的C++。然后写了一年的JAVA,再回头写C++,发现代码的效率啊,代码的结构,思考的方法等,都退化了。。
2008-12-09 16:51 | 绝对零度

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

力挺c++
2008-12-09 21:14 | 一小步一大步网

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

同意一楼的。我感觉这篇文章本身的题目就不好,仿佛是c++模仿java而来的一样。
2008-12-09 23:13 | ppc

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@我也写java
我是C++出身的,自问有一些水平,一般的C++问题基本都能搞定。后来,由于工作需要,我又学了Java(不是转成Java,是又多做了一份工作,嘻嘻),用了很久了,对Java也很了解了。

我想说的是:
1、名词,概念比C++少多了,以实用为主,摒弃了很多纷繁的技术细节;
2、如果你是用的P4以上的机器,效率基本不是问题,尤其是在大型Server上;
3、如果你不认为汇编永远是最好的选择,很多场合下,快并不意味着烂;
4、从对底层实现上讲,“有些”写Java程序员的能力,真的有待提高,知识很表面化,和“大多数”C++程序员相差实在太远了;但是在大多C++程序员都还在为内存每秒泄露1byte而郁闷的时候,Java程序员却在想着怎么把功能做得更好;
5、我加一条,Java的基于大型应用系统的很多思想是非常优秀的,如果你只做过HelloWorld而已,那你就没有发言权。

最后声明一下,作为C++程序员,我永远不否认C++是最优秀的语言之一,在特定的场合下,他甚至是你唯一的选择。但是,只有最适合的才是最好的。我们不能想象,现在还有谁会去用C++写的CGI去构建一个大型的网站或企业级应用系统(虽然技术上是可行的);我们也难以相信,有人会去试图用Java或PHP去实现一个类似OOo的桌面软件(虽然技术上是可行的)。
2008-12-10 08:44 | abettor

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@我也写java
这位仁兄貌似不知道字符编码(或者说字符集)是啥东西,估计大哥没做过网络程序,要不然就是只是内部网络,没有跟别人的系统连过。任何语言都会涉及到字符编码的问题。

你没发现Windows的记事本有时候打开一个TXT文件时会是乱码吗?你觉得那一定就不是真正的文本文件了吗?Linux下的gedit是Java写的吗?为什么他也支持各种字符编码?
2008-12-10 08:51 | abettor

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

吃饭就用筷子,架电线就用电线杆,不能乱用,尽管理论上可以用
2008-12-10 09:45 | zuhd

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@abettor
如果你的C++很强的话,你真的会鄙视java,也不屑于写java代码。
CGI?不用这个,因为我们的http server是用C++自己写的,参考了lighttpd,能实现任何功能,当然是我们需要的一些功能.
2008-12-10 10:57 | 我也写java

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@abettor
这位仁兄貌似不知道字符编码(或者说字符集)是啥东西,估计大哥没做过网络程序
=========================
我写的:“字符串是什么?这在C++的眼里,只不过是一片连续的内存,且这片内存可以跨任何平台”,我真的找不到比这更优美的阐述了,哪里有错呢?
你可能还是java写多了,所以觉得各种编码转来转去很神秘吧。
1、一片连续的内存不用说了,基本概念而已;
2、这片内存跨平台,可能更本质点。因为ASSIC, UTF-8, UTF-16(UNICODE)都是国际标准,这就表明在任何平台他的编码和内存表示应该是相同的,你把Win一段字符串的内存(不管什么编码),传送到任何一个平台,所表示出来还会是相同的东西,这就是我所说的内存跨平台。
2008-12-10 11:08 | 我也写java

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@我也写java
呵呵,字符编码确实不神秘,Java的String其实是把字符编码这个技术细节给隐藏了,只有需要以某种编码去处理的时候,才需要(很easy的)得到他的byte数据,当然,也就可以认为是一块连续的内存(当然,仁兄也必然知道,即使是C++层面看的“连续”的内存,在物理上也不一定连续,只是逻辑上是这样的罢了)。

我早上的语气可能有点硬,其实我的意思是说在某些场合,用Java才是最好的选择。我很钦佩仁兄自己实现了一个http server,许是有特殊的应用场合吧。但我不知道你的这个http server能够最生产生活提供那些业务服务。我猜可能是用这个http server去解析类似php或perl这样的脚本语言来实现吧。

说实话,我的本职是C++程序员,做了3年了,自认为脱离了菜鸟行列了。但是,接触Java后,我发现我的C++水平立刻提高了一些,这说明什么?具体语言之间其实并无恩怨,只是大家可能在心里有一些先入为主的偏见。

还是那句话,最适合的才是最好的。
2008-12-10 12:20 | abettor

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

对字符串预编码有时侯是很郁闷的事情.

D语言在这个方面的设计就让人很XX. 赋值的字符串直接输出全部是乱码, 转来转去的很烦. 还记得当初java的Unicode编码的转换问题吗?

C++中字符串和其它的数值没什么区别, 编码仅在需要的时侯才转换(转换编码是程序员的责任), 编译的时侯是直接保存你输入的编码的数据(当然你也可以指定Unicode进行编译时转换成Unicode ).
2008-12-11 13:38 | jmchxy

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@我也写java
我写的:“字符串是什么?这在C++的眼里,只不过是一片连续的内存,且这片内存可以跨任何平台”,我真的找不到比这更优美的阐述了,哪里有错呢?
---------------------------------------
你说的是c-style string,而不是C++ string,在C++这种OO语言里,字符串是一种类型而不是一块内存(虽然是封装起来的)。而std:string本身只支持ansi,对于其他编码是不支持的。另外对于多字节的编码来说,根本就不能跨平台,最简单的就是大小端问题,如果你做过跨平台的网络程序,应该知道这点。国际标准不代表每个平台的实现都是一样的,假设在intel CPU下的“我”占两字节编码是E1 E2,而在另外个CPU上因为大小端问题,应该表示成E2 E1才对。表示出来是一样,但是内在的数据却变化了。所以你提出的两个观点根本站不住脚。
2008-12-12 09:20 | guest

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

写程序的不应该有语言歧视,从stl到boost,C++的发展倾向于GP,而不是OOP,在OO上,C#,JAVA等都做得比C++要好。即使是做网页脚本的Javascript也有很多优美的地方,例如prototype,闭包,高阶等。javascript一个prototype就可以实现继承,名字空间,私有等,简洁而优美。

每种语言都有自己的定位,做好自己的本分就好。
2008-12-12 09:26 | guest

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

Java其实真的很差,C++才是王道
2008-12-12 11:08 | 不懂

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@guest
1、关于c-style string,还是C++ string,拜托,都什么层次的人了,跟我讲这些干什么,难道我不知道?。我不写你写出来的那些,是因为我觉得那不值一提,你把我当学生哥不成?
2、CPU大头,小头?拜托,难道以为我连这都不知道?你又把我当学生哥不成?字符编码是二进制级别的规范,换句话说是硬件上的规范,这可不是逻辑上的10进制规范,哪里有大头小头的问题,int,long,doulbe这种东西才会不能跨平台,因为没有ISO标准。你想想XML能跨平台不?能,XML是什么?一片连续的字符编码内存。
3、你需要更深入的学习,另外不能拿点皮毛当老师,最好不要写java了,因为它让你出丑了。
2008-12-12 11:29 | 我也写java

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

英语好还是汉语好?
2008-12-12 12:50 | abettor

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

Java就是一角本语言,也好意思出来晃

Java看起来好象非常强大,什么都能干了

实际做项目的时候,除了javascript,别的什么也干不了(局陷性太大),就是一大忽悠
2008-12-12 12:58 | 不懂

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@不懂
呵呵 这位兄弟连java和javascript根本就是两回事都不知道,果然是不懂。
2008-12-12 22:30 | 你真的是不懂

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@我也写java
你的意思只不过是大家准守共同的标准罢了,char *是C++所提倡的字符串嘛?我的意思是严格的C++字符串只是string/wstring而已,这个本身也涉及编码问题。

我主要是写C/C++程序,但是最近一个项目是监控下位机的,用了JAVA,就是比C++快啊!

看过singularity这个操作系统吗?驱动,IO,文件系统,线程调度都是用C#实现的,剩余的OS引导和一小部分HAL才是用C和ASM写的。倘若硬件直接支持C#或者JAVA的字节码,那和C/C++/ASM就没什么区别了,而且现在intel,sun等也开始着手这方面的事宜。

C++都快成了YY语言了。
2008-12-12 22:42 | guest

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@guest
char*,string这种社会主义初级阶段的概念,就不必讨论了。这里不是CSDN,讨论这个有点脸红。

从你的回复里面,我想指出一下几个问题:
1、java是解释语言(JVM vs 字节码),它的速度低于编译型语言,这个是死理,没谁敢否认。我的经验是速度能达到C++的10%就很不错了;

2、有IO的程序,测速度那是扯谈
for(int i = 0; i < MAX_INT; ++i)printf("%d\n", i);
上面这行代码,你几个小时也执行不完成(去掉printf毫秒完成),因为需要IO到屏幕上,任何IO都是慢东西,CPU在等它,所以这时瓶颈就来了,卡在了最窄的地方。同样的道理,你那个监测什么上位机,效率瓶颈在IO,只要CPU没有达到100%,用任何语言都没有效率差别。测语言的效率,必须要没有IO且CPU 100%才有意义;

3、硬件直接支持C#或者JAVA的字节码,这个不够确切。应该是java, C#本地化或者hardware JVM。
CPU接受二进制指令,字节码也是二进制指令,怎么说不支持?应该是不兼容,因为JVM与X86的指令集不同,JVM更高阶,拥有更多指令,但是他们是同质的,只不过一个是硬件一个是软件虚拟;
java提高效率的途径,有2条路,不过我看来,2条路都比较飘渺
可以本地化,这个当然不现实,因为java的最大支柱就是号称的跨平台,不能失去JVM,注定不能从解释语言变成编译语言,此路不通。
可以让X86 CPU支持JVM指令集,这当然更是扯谈了,SUN就喜欢忽悠愣头青。不过一个可能的方向是hardware JVM的出现,这个是可能的,但是做这个也是傻子,因为java注定没落,除非哪个巨无霸比如IBM,像MS扛C#一样,往死里顶java,把硬件也上了。

4、看过singularity这个操作系统吗?
这世界垃圾的软件和技术很多,没必要个个都知道吧
2008-12-13 00:15 | 我也写java

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

回:你真的是不懂

看来你还是在念书啊,只讨论纯JAVA的东西。
在实际的项目中,有这样的吗?和Java有关的技术你一概不用?说Java难道对于你就只有Java语言?

实际的工程环境中Java相关的东西能完成的工作和MS的完全不是一个层次的。
2008-12-13 13:12 | 不懂

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

我主要是写C/C++程序,但是最近一个项目是监控下位机的,用了JAVA,就是比C++快啊!

这一句太搞笑了,哈哈
2008-12-13 23:17 | 不懂

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

回:最后声明一下,作为C++程序员,我永远不否认C++是最优秀的语言之一,在特定的场合下,他甚至是你唯一的选择。但是,只有最适合的才是最好的。我们不能想象,现在还有谁会去用C++写的CGI去构建一个大型的网站或企业级应用系统(虽然技术上是可行的);我们也难以相信,有人会去试图用Java或PHP去实现一个类似OOo的桌面软件(虽然技术上是可行的)。


看一下:http://www.cppblog.com/lylrabbit/archive/2008/12/12/69257.html,你会发现C++其实可以的
2008-12-13 23:23 | 不懂

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

楼主并不没有真正掌握C++或java。
2008-12-26 16:31 | bati

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

跟贴的小鸟挺多的,呵呵。
C++的string就不是一个类型,是个纳入的C++标准扩展类而已,并没有进入核心类型。

另外string是一个模板的实现(basic_string<char>),理论上你可以静态重载模板参数来使用任何字符集

UNICODE: wstring basic_string<wchar_t>;

字符编码当然是个标准,并不存在平台的不同,否则就不是标准。
至于高低字节顺序的问题,那应该有程序转载文件是做转换,不是说文件内编码顺序不一样
2009-03-30 22:06 | llbird

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@我也写java
"相差实在太远了"是什么意思?不会用指针吗,或者不会delete吗?其实什么语言都看在谁手里用.不用说谁也知道java没有c++这种本地方法快,但优点也是显然的,不要说"快餐"不好,很多人写的c++还不一定有java效率高呢,而且c++很容易泄漏内存.其实真正的会为自己所用才是好的,开发上层应用java肯定是不错的选择,而底层操作比较多当然选择c++方便.
2011-04-03 13:05 | bluemei

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@我也写java
"相差实在太远了"是什么意思?不会用指针吗,或者不会delete吗?其实什么语言都看在谁手里用.不用说谁也知道java没有c++这种本地方法快,但优点也是显然的,不要说"快餐"不好,很多人写的c++还不一定有java效率高呢,而且c++很容易泄漏内存.其实真正的会为自己所用才是好的,开发上层应用java肯定是不错的选择,而底层操作比较多当然选择c++方便
2011-04-03 13:07 | bluemei

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@我也写java
"这片内存可以跨任何平台",c++的程序员都应该知道(这确实比很多java人知道多一点),首先操作系统就有高低位的不一样,然后还有字节值意义的不同(如换行符等),最重要的是,就是能正确的拷贝这块内存到其它平台,也是需要把这个字节数组显示出来,如果本来是中文的却按一个一个字节显示那不乱码了,编码是很重要滴,因为世界语言太多了.
2011-04-03 13:25 | bluemei

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

@我也写java
"字符编码是二进制级别的规范,换句话说是硬件上的规范,这可不是逻辑上的10进制规范,哪里有大头小头的问题",不是这样子的吧,一样的编码在存储时高低字节也可能是不一样的,由FEFF和FFFE来标志;在网络传输时高低字节的发送顺序也不一定一样.既然不一样就存在"大头小头"问题
2011-04-03 14:25 | bluemei

# re: 从Java到C++ — 对比Java与C++编程的不同  回复  更多评论   

一群sx,讨论这个有意义吗?某些C++程序员就会吹,神话一门程序语言,贬低一门语言。说效率,你怎么不去写汇编啊,能干的事更多。吹c++的我看都是个人英雄主义作祟。本来就是各有各的好,合适的地方用合适的东西。把java贬的一文不值是什么心理?java能量产程序员,更好的工业化软件开发,更快的开发出客户想要的产品,而且使产品更稳定。
2013-08-21 17:24 | 吹吹吹

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理