一個C++老鳥眼中的 C++ VS Java

用C++開發程序多年,用java寫則較少。

C++和java都是很棒的語言,套用一句李連杰的話就是: 語言本身沒有優劣之分,但程序員有強弱之別。

1、在內存管理方面 在這方面我更欣賞java,也認為這是java比C++更易用的重要原因。C++的用戶自己管理 內存和靈活的指針用法往往讓用戶為了一個內存問題而調試好幾天。讓用戶自己釋放內 存使得用戶必須非常小心,在程序有多個出口或指針被多個線程或被多個容器擁有的情 況下,何時能安全的釋放內存都必須非常謹慎的,而且還要保證在程序的各個出口都保 證不內存洩露,這簡直就是噩夢!智能指針能解決一些問題,但他帶來的問題同樣很多 。java的自動垃圾收集簡直就是一大解脫!

2、在多線程編程方面 多線程編程大大增加錯誤的隨機性和破壞了接口的"抽象",要在C++中設計好一個多線 程程序往往不是件輕鬆的事情。所以我更欣賞linux/unix下以多進程為主的編程手法。 java用"同步方法"來解決同步問題使得多線程異常簡單(相對於C++),但在多線程方 面我更喜歡C++,因為java的方法雖然簡單,但太過小兒科了,帶來了兩大弊端: 1)java採用了鎖住整個對象的粗粒度多線程同步控制,而C++可以用更細粒度進行控制 。java採用的方法是這樣的:類A,類中有成員變量m1、m2,為了保護成員變量,將類A 中所有訪問這兩個成員變量的成員函數設為synchronized,當某個線程T1調用了類A對象 (記為obj)的synchronized方法時線程T1將鎖住整個對象obj,此時若另外一個線程T2 調用obj的synchronized方法(不一定和T1調用的那個方法是同一個方法)將阻塞(若T 2調用了obj的非synchronized方法不會被阻塞),直到T1調用完synchronized方法為止 。這種鎖住整個對象的做法顯然簡化了實現,控制不夠精細。例如,若T1調用了obj的一 個只訪問m1不訪問m2的方法,由於T1鎖住了整個對象obj,導致了T2若調用obj的只訪問 m2而不訪問m1的方法也會阻塞,這顯然不合理的。而且能造成重大的性能損失。 2)java採用鎖住對象的方法來實現同步在很多情況下也不合理。因為要同步的資源往往 不是類的私有成員。如我們要同步的資源是某個文件A,在C++情況下,給A配把"鎖"即 可,而java會鎖住訪問文件A的對象,這就要求所有線程都只能創建一個對象供所有線程 共享使用,否則不同的對象就可以同時訪問文件A了,同步防護失去了意義。這就帶來很 大的不便,需要程序員自己注意不要在別的線程中也new出一個對象來。

3、在網絡編程方面 在這方面我更喜歡java,java不愧是靠網絡起家,網絡編程在java下特別簡單。而用C+ +來寫網絡程序實在是太麻煩了。 在 Visual Studio 2010 編寫 C 程序 http://www.nowamagic.net/cpp/cpp_WirteCInVS2010.php

打開VS2010 -> File -> New -> Project -> New Project -> Visual C++ -> Win32 -> Win32 Console Application. 輸入工程名 -> 單擊OK -> Next -> Finish,然後你會看到這樣一個文件。

view source print?

01 // HelloNowaMagic.cpp : Defines the entry point for the console application.

02 //


一個C++老鳥眼中的 C++ VS Java

03 04 #include "stdafx.h" 05 06 07 int _tmain(int argc, _TCHAR* argv[]) 08 { 09 return 0; 10 } 把它改成: view source print? 1 #include "stdafx.h" 2 #include <stdio.h> 3 int _tmain(int argc, _TCHAR* argv[]) /<stdio.h>

4 、{ 5 int a; 6 printf("Hello NowaMagic!"); 7 scanf("%d", &a); 8 return 0; 9 } 運行程序: 右擊項目名 -> Property -> C/C++ -> Advanced -> Compile As,選擇Compile as C Code(/TC),就可以了,所有的代碼就會按照C標準去編譯。 到此,我們就可以使用 Visual Studio 來編寫 C 程序了。


分享到:


相關文章: