Re: [請益] 如何學習C/C++並能使之成為應職技能?

看板Soft_Job作者 (真.粽子無雙)時間9年前 (2015/02/11 13:11), 編輯推噓3(3010)
留言13則, 5人參與, 最新討論串5/18 (看更多)
※ 引述《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
C/Java聯手無敵,C++不上不下.
02/11 13:13, 1F

02/11 13:14, , 2F
要高階快速開發有Java,要低階用C,展開看asm直接抓效能問題
02/11 13:14, 2F

02/11 13:33, , 3F
C做不到 rvalue ref,raii
02/11 13:33, 3F

02/11 13:33, , 4F
func pointer也無法inline
02/11 13:33, 4F

02/11 13:34, , 5F
C做不到 rvalue ref,raii ,func pointer也無法inline
02/11 13:34, 5F

02/11 13:36, , 6F
是對的,這時候就不能選C,但其他直譯式語言也有更便利
02/11 13:36, 6F

02/11 13:37, , 7F
的特性,C++也沒有啥優勢
02/11 13:37, 7F

02/11 13:40, , 8F
只是要inline,何必要整組換掉?
02/11 13:40, 8F

02/11 13:40, , 9F
stl sort 狂電 qsort 也不是新聞了
02/11 13:40, 9F

02/11 15:38, , 10F
我還滿推你的觀點,就明確這點,我也覺得C比C++要好多了
02/11 15:38, 10F

02/11 17:05, , 11F
std::string vs strcpy/strncpy/strncpy_s/mempcpy
02/11 17:05, 11F

02/11 17:06, , 12F
static_cast<whatever> vs (void*)
02/11 17:06, 12F

02/11 17:06, , 13F
嗯,C狂電C++
02/11 17:06, 13F
文章代碼(AID): #1KskIAD6 (Soft_Job)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 5 之 18 篇):
文章代碼(AID): #1KskIAD6 (Soft_Job)