看板 Soft_Job 關於我們 聯絡資訊
※ 引述《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