作者xtxml (赤木巧☠)
看板Soft_Job
標題Re: [請益] 如何學習C/C++並能使之成為應職技能?
時間Wed Feb 11 14:55:41 2015
※ 引述《leolarrel (真.粽子無雙)》之銘言:
: ※ 引述《noonOut (中午外出)》之銘言:
: : 身為一個 c++ 愛好者(?)
: : 也來幫 c++ 說說話吧
: 身為一個很多語言我都有在用的人,想反駁一下
身為一個以 C <-> C++ <-> Python的使用者,
其實我大概同意您的觀點,有時候寫code的確原本是個C++專案,
最後追求極致的效能跟開發速度之後,直改成C + Python,
但有部分我想提出我的看法。
(另外,雖然我提了Python,但我不想拿讓Python加入討論,
拿一個編譯語言跟腳本語言比,基本上已經是張飛打岳飛了XD)
: : 他被銷毀的時候誰會被呼叫,這意思也就是說,compiler 到底在你的 code 裡面大概
: : 幫你幹了什麼事情,在你這個 frame 結束前他有幫你做什麼。所以 c++ 管理資源的方
: : 法在於你對於每種方法的認知和他的代價。
: 想到精確的控制資源取得與釋放,C做得到,而且做的比C++更加的透明,不黑箱,如果使用
: C++依樣要"嚴格的紀律",那我為何不選擇黑箱作業比較小的C?
: 另外,如果在意gc,那麼c/c++ 直接被推到推薦名單的最後面去,因為他們還要掛lib才做
: 得到,應該首選現在較為先進的語言
我不知道為什麼這個討論串出現"黑箱作業"這個詞,
並沒有哪個功能是你trace到盡頭找不到他在幹嘛的。
事實上,C#也有boxing和unboxing,java也會對primitive type做wrap,
OO語言的實現方式裡面,為了對primitive type做包裝或其他理由,
本來就出現各類隱式轉換,這說是黑箱我覺得有失公允。
C和C++都一樣,基本上你遵守良好的風格,就會得到好的表現,
你真的說要亂搞,C++亂重載運算子還只是小事,C能搞出來的事更多采多姿,
所以論那種大多coding standard都會避免的事,沒什麼意義。
如果說這點學習痛苦太多,那我承認,
然而熟C++的人,每個動作都應該知道他背後的在做什麼事。
如果你是一個不隨意亂用include和using,熟知基本容器特性的人,
你大多的出錯,在編譯時期就都被擋下了。
: : 說到型別 c++ 有個很有趣的型別系統。型別讓你在 compile time 的時候指導
: : compiler 走進正確的路,或者是生出正確的 code。甚至在 compile time 做計算。
: : 你可以提供一段程式碼,它用起來就像真正的函數一樣,可是他可以在 compile time
: : 的時候透過 compiler 已經認知的型別插一段 inline 在你的 code 裡面。因為
: : inline,所以沒有 locality 和 function call overhead,可是你用起來就像是
: : function。或者是新的 rvalue ref,你可以告訴 compiler 某個物件在某種狀態的時候
: : 用這個 function,在 function 中你可以知道這個物件已經要走到盡頭,所以你可以不
: : 用擔心之後還會被別人用,放膽地把它生吞活剝。
: C/java一樣做得很好,C++在這部分不算特別突出,所以這理由很弱.
: : 用 template 基本上就是用空間換速度,當然空間大到一定的程度也會影響到速度,
: : 所以用的時候必須有點 sense 到底這樣下去會發生什麼事情。亂用 object code 就會
: : 變大。compile time 可以幫你做好 template 計算,你可以準備特化樣板讓 compiler
: : 去用,只要設定得當你可以透過一個很 general 的樣板生出針對不同型別具有特殊
: : 意義的 code。
: 用泛型跟樣版就像你說的,要"有點sense",不能亂用.現代的直譯式語言方便多了,沒必要
: 為了泛型跟樣版而選擇C++
不會有人會只因為要做TMP而選擇C++,但樣板確實是C++一個相當大的特點,
整串討論幾乎把這點都草草帶過了。
C++ STL和boost這兩個國際廣泛使用lib,幾乎整個都是template所構成。
C#的template相當受限,C++ template則可以說是語言的軸心之一。
template關鍵就在於靜態的型別處理,利用trait在編譯期就區分各種型別的策略,
完全不依賴動態判斷,效能高,不會runtime才跟你跳error,缺點是編譯慢。
這不是一個編譯語言可以隨意做到的特性,但我同樣也不認為,未來這件事不會被超越。
事實上,我不是C++的信奉者,
如果哪天出了一個C加上template的語言,我就會奉他為神。
: : 最後講到 oop,我相信講 oop 大家都不會推 c++,老實說我也沒有寫過真正的 oop,
: : 我認知的 oop 大概就像 java 裡面那種有 dynamic cast 然後所有物件都是 object
: : 的 oop。c++ 不是這樣,但他的 oop 非常好理解,前提是你要對 function compile
: : 以後長什麼樣子有點概念。什麼東西大概會變成什麼符號,什麼東西會跟著特定物件
: : 走。然後指向 vtable 對於一個物件到底是什麼意義。怎麼樣可以讓物件在 run time
: : 的時候找到一個 function,這跟 c 的 function ptr 有一點異曲同工之妙,實際上
: : c 也可以用 function ptr 來建造 virtual function。
: : 所以我會說 c++ 是個很難的語言,因為你要很清楚你的每一步踩在什麼上面,但是他就
: : 像寶庫一樣你可以一直挖。而且我相信用到極端的狀況 py 和 java 不會簡單到哪去,
: : 只是學習曲線和信仰問題。
: 你要用C++繼續開發你的程式我是沒有什麼意見,不過你自己也說C++是一個這麼難的語言
: 那麼學習一個那麼難的工具,結果這個工具的效用跟其他工具比起來差不了多少....
: 那為何要去學習難的那一個??有被虐狂嗎??
學C++不是被虐狂,是多一種語言開發的能力,多一個擴展C的方法。
『這個工具的效用跟其他工具比起來差不了多少』
有多少效用,完全看所處的環境而言,工具真的差不多的話早就整合起來了,不是嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.131.77
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1423637743.A.A05.html
→ leolarrel: 因為我是回noonOut的文,所以我的發言跟會他的發言有 02/11 15:00
→ leolarrel: 前後文相關 02/11 15:01
→ noonOut: 自己的文章自己負責 他有引用你的也有引用我的 02/11 15:16
※ 編輯: xtxml (125.227.131.77), 02/11/2015 15:20:25
→ zb26: C++跟javascript的累人特性在於,一個團隊裡面甚麼人都有... 02/11 16:48
→ zb26: 所以當一個語言必須被三令五申,只使用其優良部分的時候... 02/11 16:48
→ zb26: 很容易對這個語言就出現壞風評... 02/11 16:48
→ ACMANIAC: 這年頭還有人在扯前後文相關啦...orz 02/12 06:52