為什麼玩C++的都喜歡調用別人的庫?

小弟用C#也有幾年了,做的C/S多,一直想學多門語言,看好C/C++,所以也做了一些對比

C#:

感覺C#太高級了,底層接觸得太少,像之前用C#想寫個高性能的socket服務端,中間就發現很多問題,後來都一一解決了,網上都搜索不到答案,都是教你這個類怎麼用怎麼用的,也從來沒講過原理,幸虧群里的C/C++大神指點的底層知識原理,後來根據底層知識才一步步解開難題。打個比方,就說TCP長連接需要檢測心跳,根據網上的答案和論壇上很多人的說法就是發包給對方,所以造成了很多C#的程序員,直接就在應用上編寫數據發包給對方,後來我才發現原來socket本身就有這個心跳機制,並不需要我們構造心跳數據,只是默認的心跳間隔時間很長,但只要設置下相關的選項就可以了。再打個比方,像多線程,有的人以為開得多就快點,所以有的C#程序員一開就是幾十上百條幾百條,其實cpu切換線程是需要時間的,有時線程多還不如少量的線程快。哎,終究到底,都是不懂底層知識才掉進了坑。

C++:

小弟是想著用C#配合C++,C++做底層高性能核心dll,C#做界面和業務邏輯,看好C或C++,貌似C什麼都要自己干,就連字元串類型也沒有,還要char[] *p這樣,當然我只是簡單了解了下,而C++給我的印象是使用的人比C要多,而且大多數牛B的軟體都出自C++多點,而且C++又有C的底層功能,還有面向對象這些,所以小弟終於決定了學C++。

我知道學習的過程是枯燥漫長的,很多學生學了很多時間也搞不出個程序來,不知道窗口程序是怎麼弄出來的。不知道學的東西有什麼用,用在什麼地方,這是原因之一,其二,有的老師教C++是偏向linux方發,但學生並不知道,學生只喜歡界面程序,因為最起碼這讓學生對編程有個輪廓上的認識才好繼續學習下去。所以我學習一向都是跳著學,學自己喜歡的,學自己用到的、有需求的。

C++給我的印象就是較底層,很多東西都要自己去實現,C#相反,直接調用類庫就可以了,很多都是現成的類和函數。

但我在百度上搜索:C++ socket服務端,C++http實現,C++高性能XXX,等等網路技術關鍵詞,點擊進去,發現全部都是調用某某庫、某某框架,什麼ace、libcurl、Asio等等,都是調用別人的類庫,那和C#調用.net的類庫有啥區別?為啥不是自己寫的?其實對於我來說,如果自己能實現高性能的,就絕不會使用別人的庫,因為有安全隱患有坑也不知道,最可怕的是到了項目被應用開來了,那時才出現問題。之前用sqlite、mongod、hp-socket,深有感觸。

既然C++都調用別人的庫,那和C#調用.net的類庫有啥區別?如果是這樣的話還不如C#爽啊。。

一直以為C++很多都要自己實現,其實自己實現,實現的是什麼?

小弟對高性能網路編程有著濃厚的興趣,不知道C++要學習哪方面的知識?


C++用戶並不是最喜歡調用別人的庫的,因為C++的庫相對Java/C#那些語言來說要亂一些,很多庫缺乏統一標準或者標準出得太晚,所以C++用戶其實是最喜歡自己造輪子的。我對這一點是深惡痛絕,舉個例子,假如我需要某某功能,但是不想自己寫了,於是去找一個別人寫好的庫,在網上找了半天,終於找到一個,哈哈哈真開心;深入進去一看,我*,這個庫用了自己的字元串類,和我用的不兼容,要轉換,有性能損失;我*,這個庫用了自己的容器類,和我用的不兼容,要轉換,有性能損失;我*,這個人的花括弧沒換行,簡直不能忍……


為啥用別人的類庫?自己造輪子吧

為啥用別人的語言?自製個Compiler吧

為啥用別人的操作系統?自製個os吧

為啥用別人的電腦?自己買部件造一個吧

為啥用別人的二極體?自己買原料燒吧

為啥用別人的金銀銅鐵?自己挖吧

為啥用別人的十字鎬挖?自己用石器造吧

若干年後我們看著題主從無到有,一個人從石器時代獨立自主不要他人一點東西發展到了未來時代,紛紛羞愧的刪除答案


你先看一下stl的實現,再去看看boost的實現

然後心裡就會有B數

一般人 -> 寫又很難寫得比stl/boost好,時間上也不允許你慢慢琢磨,不能的

就先用別人的庫,DRY,不行的拿同類型庫,同樣條件做profile,交叉對比,再不行的才自己寫

大神 -> 都不外如是,想寫就寫對了,別懷疑,可參照Ekmett大神兩天寫完Haskell OpenGL binding


你寫個應用,gui部分寫完了五年過去了,等整個應用寫完了C++29都出來了。

你自己寫的東西先不談要做多久性能才比得過別人的那些庫。你覺得別人的庫坑多,但是人家有的是人在踩坑,而你自己寫有幾個人會幫你踩坑?很多庫好歹也好幾年甚至好幾十年了,你能踩到的坑也修的七七八八了,你自己寫的能比得上嗎?


瞎說,玩C++的明明就是最不樂意用別人的庫的那一群人,連Boost STL很多時候都不樂意用。

估計題主遇見的並不是「玩」C++的而是被逼趕工的人,面向deadline編程當然是怎麼省事怎麼來。


C++替換成C/Python/JavaScript/Java/......也成立

你應該問: 為什麼寫程序的喜歡調用別人的庫

我們還可以擴展一下:

為什麼寫程序的喜歡用別人寫的軟體

為什麼用電腦的喜歡用別人寫的系統

為什麼用電腦的喜歡用別人造的電腦

為什麼......

你覺得為什麼?

(只是懟一下題主的標題,起的實在是。。。。


釘個釘子難道還要我自己去探鐵礦石,挖礦,煉成鐵了,再自己加工成鎚子?


最簡單的理由:自己不會寫。

比如解析 JSON,我就直接使用 RapidJSON。

還有,自己寫庫不一定能實現高性能。因為自己的經驗不如別人豐富,有安全隱患有坑也不知道。


STL/Boost把C++用戶帶到了「只怕抽象得還不過癮」的歪路上去了


因為你自己寫不出來那麼完善的庫。

以及計算機行業能夠發展的很迅速,有一條很重要的準則叫做「不要重複造輪子」。各路專家大牛們寫的庫,被廣泛的使用,經過了眾多實踐的檢驗,實在是非常可以放心使用的。如果不是有特殊的需求或者只是研究學習,你有什麼必要再去做這些重複的工作呢?


你說的那些你的認知吧,還都是有那麼些一點問題的。

C#太高級而C++比較底層

C++也很高層,你說的那些什麼TCP socket心跳機制,多線程中線程切換的性能損耗,跟語言沒有半點關係。你需要學習的不是你所謂「底層」的C++而是網路原理,操作系統,體系結構等計算機系統基礎知識。

那和C#調用.net的類庫有啥區別?

沒有區別,他們甚至可能用的都是同樣的底層實現。

如果自己能實現高性能的,就絕不會使用別人的庫,因為有安全隱患有坑也不知道

你哪裡來的有自信能夠自己實現一個比庫還要高性能的?不多說別的,咱們先寫一個通用的排序演算法出來做到比STL的std::sort要快試一下吧。

至於安全隱患?別人的庫有安全隱患有坑不知道這個是存在的,但是你自己寫的代碼只會有更多的安全隱患。bug是無法避免的,但是一個庫開發的人多用的人也多的話,更多的問題會早早的被發現出來並解決掉了。自己寫的?只可能是你自己覺得沒有問題,然而實際上問題大了!

很多學生學了很多時間也搞不出個程序來,不知道窗口程序是怎麼弄出來的……所以我學習一向都是跳著學,學自己喜歡的,學自己用到的、有需求的。

為什麼一定要執著於弄窗口程序?在很多情況下窗口程序只是看起來有趣而不涉及很多原理性的東西,你拿C#拖拖拽拽完全學習不到任何更深的東西。你所謂的跳著學可能只是在自己瞎搞,脫離了知識體系構建的過程,最終學到的東西支離破碎。我的意見還是按照正常的路徑來走。

小弟對高性能網路編程有著濃厚的興趣,不知道C++要學習哪方面的知識?

如上,光學C++是沒有用的,請去深入了解網路原理,操作系統,以及熟練使用Linux系統的API介面。


不一定都喜歡啊

我這種閑的沒事的就喜歡寫庫和stl比性能…

雖然經常寫成c with class(


你不覺得線程和套接字的原理和 API 是無關的嘛?

想要用好哪種 API,都要理解這裡面的原理。不是說,用了系統 API,就自動習得了原理似的。用著系統 API 而嘲笑標準庫 API,簡直就是五十步笑百步。

那些講套接字的書,把代碼換成 C# 或者 Python 的 API 來講,照樣能講得明白。很明顯了。


不是學了C++就能了解底層的,現在的C++也很高層

也許您需要補一補操作系統計網等基礎知識

而且C++寫出來牛逼的庫更難


要不 你不妨自己從沙子開始開發?


先指出你對於socket 心跳的理解是錯誤的。心跳的確應該自己在應用層實現,可以關注一下這個問題下面的回答 TCP中已有SO_KEEPALIVE選項,為什麼還要在應用層加入心跳包機制??。

這個題目不太正確吧。調庫是一件節約時間的事情,這不僅限於C++吧。或者調庫和語言無關。你提出這個問題,倒是常見於半路出家的程序員或者java/C#程序員,因為總是被大量的crud業務代碼包圍,時間越長,心裡就越沒底。似乎覺得自己什麼都會(知其然,碰到問題知道如何組織語音,然後去搜索解決方案),又覺得自己什麼都不會(不知其所以然,原理底層)。不過即便是調庫的crudboy,也不是所有人都這麼焦慮。心態的不一導致了兩種極端,因為即便「不知其所以然」但是每次都能解決問題。一部分人會逐漸膨脹起來,覺得自己解決問題的能力還是很強,框架玩的溜,配置寫的溜。而另一部分人會更加焦慮,覺得自己似乎什麼都只是掌握了皮毛。相比於把整個架構把控能力完全交給框架或者類庫,他們更願意切實的提升自我,因而每次碰到難題卻又被類庫解決,焦慮感又會疊加一層。(我甚至見到過一個公認的「牛人」,連把阿拉伯數字轉換成中文這種需求(如input:128則output:一百二十八)都要谷歌一番,弄了半天找了一個庫來實現。我不知道這種人牛在何處?)

私以為,焦慮是正確的,作為一個合格的程序員,這是有追求的體現。即便要做一個調庫boy,調參boy,crudboy,也應該是以一個從容而非焦慮的心態來做。收穫這份從容的是你得先知其所以然。這也是為什麼好多程序員會強懟三大浪漫——圖形學、編譯原理、操作系統。很簡單的動機,就是克服焦慮。

我推薦你從純C學習,整個學習流程下來,你會獲得這個問題的答案。從而收穫這份從容。等你底層代碼量積累到一定程度之後,即便調庫,只需要看一眼api函數和返回,心裡也基本能逆向整個過程了。哪怕不給你源碼,你也能實現個大概。

由於C缺乏類型抽象且高度自由靈活,使得數據結構,元編程和框架基本沒有通用的。你必須手動的去實現你需要的數據結構,按照自己的需求去實現array,vector,hashmap等數據結構,monkey malloc/free檢測泄露,callback註冊從而實現測試框架諸如此類,正是因為c的無拘無束且舞台足夠大,隨便怎麼折騰都可以,既鍛煉了你的YY能力又加深了對演算法的理解,這個過程你也可以沉澱出很多自己的輪子。從而擺脫「調庫boy」的身份。

然後是高性能網路編程,這塊深下去真是個無底洞,可以直接從應用層面的優化一路向下說去,socket抽象介面,原始套接字,操作系統,協議,路由器,亂七八糟。此時一本《計算機網路》能幫助你建立這些東西的概念,有了理論基礎再說編程網路編程聖經《unp》幫助你從代碼層面來理解理論。有了這些基礎,你可能還是寫不出高性能的服務端程序,但是至少你的心裡已經「有底」了,已經收穫了內心的平靜了。


你以為你用別的語言就不用別人的庫了?怎麼這種問題也能問出來?


題主應該是受了不少誤導,所以得出了很多奇奇怪怪的結論,最根本的問題在於學的太少想的太多,思而不學則殆,切記。


因為你自己造輪子,未必能比已有的輪子更好。


C#,Java,還有其它的所謂現代語言,你調用的不是別人寫的庫么?只是你不知道而已,誤以為自己已經在底層開始封裝了。


這個問題兩個方面考慮

第一個是是因為自己寫的東西往往比不上現成的庫的效率高,舉個簡單的例子,比如計算機視覺的Canny演算法,這個演算法從描述上就很複雜,但是如果你去調opencv的API,你會發現結果很快就出來了,這是因為庫裡面進行了很多優化,比如ipp和simd啥的

第二個就是方便,比如網路庫,寫個應用總不能從socket造起吧,那開發時間也太長了

至於你所說的多線程和tcp心跳問題,這些都是基礎知識,和你用不用C++沒有關係


推薦閱讀:

寫代碼很厲害是怎樣一種體驗?
當碼農難道不需要情商嗎?
單片機編程能用MAC么?
看書自學編程書後的習題多數都敲不出來怎麼辦?
結構體定義時不寫結構體名會有什麼影響嗎?

TAG:編程 | C編程語言 | C | C# | CC |