Re: [請益] 如何學習C/C++並能使之成為應職技能?
※ 引述《noonOut (中午外出)》之銘言:
: 身為一個 c++ 愛好者(?)
: 也來幫 c++ 說說話吧
身為一個很多語言我都有在用的人,想反駁一下
: 其實我得說我真的不是完全懂了 c++。我相信多數人在看了神人的 code 也會有跟我
: 一樣的想法。如果有人覺得我寫的哪裡不對也請不吝指正。
: 對我來說我覺得 c++ 的重點就是 scope,type 還有一部分承襲自 oop 的特性
: 我寫過 java 和 py 等等其他由 platform 提供 gc 的語言
: 他們很好沒錯,你不用擔心記憶體釋放的問題。而通常 c 會用 goto 走到函數尾巴,
: 而 c++ 可以讓你透過 stack helper 來管理資源,讓你只在乎他的宣告。
: 透過 destructor 來自動釋放。這是 c++ 的特色,比起 mark and sweep 家族的方法
: 他少了 pause,而且可以精確的知道物件何時被釋放,而且由於你知道時間點
: 所以你可以做除了記憶體釋放以外的事情,比方說,關 fd,下 log....
: 當然如果 ownership 不明確,你就會需要 reference counting,就有那種 cycle 和
: thread safe 的問題,這時候你可以透過很更嚴格的紀律去要求何時應該要用 weak
: 或是何時應該要用比較昂貴的 thread-safe counter。
: 或是你也可以直接用 gc library,c++ 不在 standard library 裡面做 gc,但他留給
: 你自己做。
: 但是資源管理的同時,你必須知道什麼東西是在 stack 裡面,他大概長什麼樣子,
: 他被銷毀的時候誰會被呼叫,這意思也就是說,compiler 到底在你的 code 裡面大概
: 幫你幹了什麼事情,在你這個 frame 結束前他有幫你做什麼。所以 c++ 管理資源的方
: 法在於你對於每種方法的認知和他的代價。
想到精確的控制資源取得與釋放,C做得到,而且做的比C++更加的透明,不黑箱,如果使用
C++依樣要"嚴格的紀律",那我為何不選擇黑箱作業比較小的C?
另外,如果在意gc,那麼c/c++ 直接被推到推薦名單的最後面去,因為他們還要掛lib才做
得到,應該首選現在較為先進的語言
: 說到型別 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++
: 最後講到 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。
簡而言之,"某某功能很好懂,前提是你要qqqqqq然後注意ooooo,什麼時候可以aaaaaa,
讓pppp怎麼樣可以llllll",恩,真的很好理解 @@
那我用C的 function pointer 不就好了,更透明,更不黑箱,也不用管compiler為了搞
繼承跟虛擬會怎麼樣去"建構"vtable
: 我想說我對於 c++ 最愛的點就是,所有東西都很明確,到底我這樣做底下發生了
: 什麼事情。一個 vector push back 到底做了什麼事情,我大概心裡有底。攤銷的複雜
: 度,什麼東西會改變...等等的。然後同時因為 compile time 做完很多的事情,他的執
: 行速度快,只要你寫得好。還有 compiler 替你檢查型態和語法,讓很多問題不需
: 要等到 automation 的時候才發現。
C做的更好,因為C compiler 根本不太會幫你做啥事,另說到compile time 做完很多
的事情,他的執行速度快的事情,現在直譯式語言都可以build成machine code,C++
在這個方面在現在動輒1.6G起跳的CPU 根本沒啥優勢,唯一能說嘴的只有編譯時期檢
查型別錯誤
: 所以我會說 c++ 是個很難的語言,因為你要很清楚你的每一步踩在什麼上面,但是他就
: 像寶庫一樣你可以一直挖。而且我相信用到極端的狀況 py 和 java 不會簡單到哪去,
: 只是學習曲線和信仰問題。
你要用C++繼續開發你的程式我是沒有什麼意見,不過你自己也說C++是一個這麼難的語言
那麼學習一個那麼難的工具,結果這個工具的效用跟其他工具比起來差不了多少....
那為何要去學習難的那一個??有被虐狂嗎??
: ※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言:
: : c++ 太可憐了, 想為 c++ 說點話, c 之所以難學, 其中有個指標的難題, c++ 可以在某
: : 種程度上減低這樣的困難。
: : int getaddrinfo(const char *node, const char *service,
: : const struct addrinfo *hints,
: : struct addrinfo **res);
: : 呼叫 getaddrinfo 之後, 還得記得要 freeaddrinfo(result), 而 res 本身又是個複雜
: : 的 linked list 資料結構, 有興趣可以參考 man page 的用法, 雖然難不倒你, 但用起
: : 來實在太複雜。
: : 要是用 c++, 就可以使用 std::vector 來對付這樣的資料結構, 無需操作指標, 又保有
: : 高效率。
: : vector<XXX> res
: : getaddrinfo(..., res);
: : for (int i=0 ; i < res.size() ; ++i)
: : {
: : }
: : 不需要記得去 free 記憶體, 也不用使用那令人害怕的兩顆星操作。
: : 而 c++ 也提供了 std::string, 光是這個和 std::vector, std::list, 就足夠降低寫
: : c 程式的門檻, 不用辛苦的注意 \0 到底有沒加上, 字串 size 是不是少了一, 更不用擔
: : 心老是搞不清楚
: : char str[] = "abc";
: : char *str="abc";
: : static char *str="abc";
: : 這些奇怪的差異, 我還沒提到如果 function 要傳入, 或是傳回字串時的麻煩事。
: : 這些都減少了很多初學者操作指標的困擾, Joel 說過, 一個語言好用是因為你不用自己
: : 管理記憶體, c++ standard library 提供了不少的幫助, 這些都比學習 c 來得容易。
: : 我第一個自學的語言是 x86 組合語言, 遇到重重困難, 一事無成, 太高估我自己了, 若
: : 一開始改學 c/c++, 應該略有小成。
: : 從我改學 c++ 之後, 大多是她陪伴著我, c 也是靠著學 c++ 時, 順便接觸到的, 果然要
: : 操作指標難度會整個提升不少。
: : 那你說 template, oo, lambda, c++11, c++14 那些東西呢?
: : 管他的! 你需要多學習那些才能寫出程式嗎?
: : 雖然工作都是以 c/c++ 為主, 不過薪水沒有特別高。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.6.195
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1423631498.A.346.html
→
02/11 13:13, , 1F
02/11 13:13, 1F
→
02/11 13:14, , 2F
02/11 13:14, 2F
推
02/11 13:33, , 3F
02/11 13:33, 3F
→
02/11 13:33, , 4F
02/11 13:33, 4F
→
02/11 13:34, , 5F
02/11 13:34, 5F
→
02/11 13:36, , 6F
02/11 13:36, 6F
→
02/11 13:37, , 7F
02/11 13:37, 7F
推
02/11 13:40, , 8F
02/11 13:40, 8F
→
02/11 13:40, , 9F
02/11 13:40, 9F
推
02/11 15:38, , 10F
02/11 15:38, 10F
→
02/11 17:05, , 11F
02/11 17:05, 11F
→
02/11 17:06, , 12F
02/11 17:06, 12F
→
02/11 17:06, , 13F
02/11 17:06, 13F
討論串 (同標題文章)