學習 C 到底有什麼好處?

2021-09-24 20:12:07 字數 2549 閱讀 6138

**知乎

學c++本身是教不會你程式設計的。你需要主動的、不斷的擴充套件自己的知識領域。

寫乙個學生管理系統是乙個很好的開端;但接下來,你還需要學習更多。

舉例來說,「圖形介面」究竟是怎麼一回事呢?

我們知道,計算機螢幕實際上是乙個「色點」組成的「點陣」;高清屏1920x1080@24bit,意思就是:它一共有1080行,每行1920個點;每個點又可表示2^24種不同顏色(以rgb格式表示;其中rgb的意思是紅綠藍三原色,每種原色8bit,256種取值,即有效取值為0~255)。

這個知識,就是計算機螢幕顯示的根本;一切的一切,最終都要變成這樣乙個1920x1080的彩色點構成的點陣——我們的眼睛無法區分這麼多點,看起來就是一整幅了。

我們的程式,想要顯示出「圖形介面」,就得管理好這個巨大的、彩色點構成的點陣;不僅如此,作業系統還可以同時執行一大堆程式、顯示一大堆視窗……

那麼,這麼程式的這麼多視窗,又是如何有條不紊的顯示在螢幕上的呢?它們不會相互干擾嗎?如何處理它們彼此之間的遮擋關係?那些壓根看不見的視窗,也要每秒60幀的更新它的顯示內容嗎?那些一直沒有改變過的視窗,是否每幀都必須從頭生成內容?可不可以想辦法節約掉這些不必要的計算動作?

你看,這是不是乙個「學生管理系統」的超級放大版、複雜版?

為了管理這樣乙個複雜的東西,人們不得不搞出複雜的資料結構和針對性的各種演算法;這樣還不夠,業界從mfc那複雜的訊息迴圈、複雜的對話方塊資料交換開始,發展了許多年,這才找到qt/gtk/wpf這樣精煉高效、介面與邏輯分開的、方便易用的新架構——而這些東西,就需要物件導向之類東西的幫助了。

你可以算一算,如果每秒重新整理60次,1920x1080的螢幕需要多大的計算量。

這麼大的計算量,這麼複雜的互動邏輯,只有c/c++系語言才hold得住。讓其他語言來做它,就很容易浪費太多的效能。

不僅如此。

對於遊戲之類應用,人們經常不得不用幾十上百萬個三角形拼湊出栩栩如生的3d模型;然後通過實時計算更新它們的位置,再模擬出幾個光源去照它、處理它們在不同光照下的顏色/反射等等細節——經過各種複雜的處理流程之後,通過乙個虛擬的攝像機,計算這個攝像機應該看到什麼樣的資料……最終,我們才能把這些資料投射到螢幕上,讓使用者看到乙個逼真的3d世界。

cpu處理這樣巨大的「陣列資料」顯得非常笨拙,因為它只能乙個頂點乙個頂點的處理它;後來就加入了mmx/sse/3d now之類simd指令集。但這東西的效能還是不太夠……

再後來,就有了顯示卡;顯示卡後來又發展成了gpu。gpu支援的特性又越來越多,直到現在的實時光線追蹤……

你看,僅僅一塊螢幕,這後面都有多少東西。

其中,qt/gtk/wpf之類,是別人寫出來、幫我們管理常規應用的視窗的;而opengl、dx9/10/11/12之類,則是替我們和顯示卡打交道、幫我們寫3d應用的——如果你要寫程式,那就是a3d/unity之類引擎的天下了:它們不僅幫我們打包了圖形影象以及音訊動畫模型等等方面的支援,還整合了遊戲需要用到的其他許多基礎功能,比如狀態機、地圖導航、碰撞檢測等等東西。

學c++的好處是,這類貼近底層、貼近硬體或者效能要求嚴格的程式,往往只能用c/c++系語言才寫的出來——用其他語言倒也不是不能寫,但多少都差點意思。

總之,就好像學生管理系統一樣,螢幕上的點陣同樣需要一套又一套的管理系統;這些系統是寫給我們程式設計師用的。

想要用好它,你最好搞明白它的基本原理;你要知道如此龐大複雜的東西,是如何管理的井井有條的——演算法和資料結構只是入門,後面還有專門講軟體組織結構設計一般原則的軟體工程。

寫乙個qt很難,但知道它的設計思路並不難。除了c/c++,極少有哪種語言可以給你提供這個視野。

有了這些知識,那麼qt/gtk之類東西你用起來,就會感覺它非常簡單,隨便哪種抓起來就能用。這就叫知其然又知其所以然。

正因此,其實我是不太建議學c++時著急用各種框架的。因為學框架,你用任何一種語言,從c#到python,全都能學;但寫乙個qt/gtk,寫乙個mysql,寫乙個gcc……這類把計算機體系結構挖到根子的有趣挑戰,只有c/c++系才鼓勵你去做、而且也只有c/c++系語言才能提供無窮無盡的開源優質資源供你參考。

換句話說,當別人忙著追隨qt之類框架的新版本、看著它的新特性抓耳撓腮、不知這些新api該如何呼叫時,你可以藉著c/c++這根拐杖,自豪的說「這個新特性,其實我都知道它是怎麼實現的」!

別人學用資料庫,你寫玩具資料庫;別人學用hive,你學著寫自己的big-table/map-reduce——這類東西的原理性**往往沒多少,但難度往往會高一些。

但這個投入是值得的。

一旦理解了這些酷炫技術背後的原理,你就不會說「哎呀上學時我們居然還學老掉牙的mfc,現在看著qt兩眼一抹黑」,而是「qt的抽象果然比mfc好,簡單,清晰,易用。mvc模式果然是個天才的設計,你看gtk/wpf等等,它們也都是在這個模式的基礎上發展起來的」……

換句話說,掌握一門新庫,對於徹底理解了原理的你來說,就和吃飯喝水一樣簡單。因為在已經對它的五臟六腑有了清晰理解的你看來,它們本就該這樣設計、它們這個設計是如此精典以至於只是看了它們的介面就讓你有茅塞頓開之感。

總之,如果你想學著做一些面向使用者的東西,其實並不建議你用c++。因為用它實現這類東西往往會比較繁瑣。但如果你想挖到各種技術的根子,那麼c/c++就是最最犀利的**——沒有之一。

現在給大家免費分享一套教學資源,幫助大家在成為架構師的道路上披荊斬棘。資料檢視我的主頁獲取

語義化的HTML結構到底有什麼好處?

源自 相信大家都知道html和css,知道html結構和css表現分離,知道html語義化,這些都是這幾年的熱門關鍵字。語義化的html在國內也是一兩年前才開始被追捧的,看看現在群裡談論的html結構,關於html結構的面試題,語義化的html佔據了很大一部分。那麼為什麼要使用語義化的html?語義...

dagger2到底有哪些好處?

咱們直奔主題 增加開發效率 省去重複的簡單體力勞動 首先new乙個例項的過程是乙個重複的簡單體力勞動,dagger2完全可以把new乙個例項的工作做了,因此我們把主要精力集中在關鍵業務上 同時也能增加開發效率上。省去寫單例的方法,並且也不需要擔心自己寫的單例方法是否執行緒安全,自己寫的單例是懶漢模式...

介面到底有什麼用

我們定義乙個介面 public inte ce ibark 再定義乙個類,繼承於ibark,並且必需實現其中的bark 方法 public class dog ibark public void bark 然後,宣告dog的乙個例項,並呼叫bark 方法 dog 旺財 new dog 旺財.bark...