記憶體洩漏( Memory leaks ) 和迷途指標( dangling pointers )是手動記憶體管理的主要問題。 你在連結串列中刪除了父節點,卻忘了先刪除它的所有子節點ーー你的記憶體正在洩漏。 你以正確的順序刪除一個物件鏈ー但是突然你的程式崩潰了,因此你忘記了這個資源的第二個所有者,這個資源現在試圖取消參考( dereference ) 一個空指標( null-pointer )。
為了避免這些問題,大多數現代高階程式語言實現了自動記憶體管理。 你可以手動分配物件的記憶體,但是不必擔心它們的釋放: 一個特殊的程式,垃圾收集器,知道如何正確地自動釋放物件,並回收它們以供將來重複使用。
在“垃圾收集器必備基礎”課程中,我們學習了與自動記憶體管理相關的所有不同的技術和演算法,這些技術和演算法現在已經在實踐中得到了應用。
✅這門課是給誰上的?
首先,針對編譯器工程師。
在實現程式語言時,很有可能需要實現一個垃圾收集器。 即使最初定位為“記憶體安全”的語言,如 Rust,最終也實現了自動參考計數(ARC)和其它收集器。
重申一下: 在大多數現代高階程式語言中,垃圾收集器模組(或多個 GC 模組,比如 Java)現在基本上是必需的。
如果實現程式語言不是我每天的工作?
如果你不是一個編譯器工程師,那麼這個課程對你來說仍然是有趣的。 總的來說,實現垃圾收集器或記憶體管理器是一項相當高階的工程任務。 這是一個簡單的技巧: 你參與一些複雜的專案(如垃圾收集器、編譯器、直譯器等) ,在構建它時,你將學習所有不同的資料結構和演算法。 然後回到“每日程式設計” ,得到能力上的提升以成為一個更好的工程師,掌握了複雜系統的可轉移通用知識。
✅這個專案我需要熟悉 C 還是 C++ ?
也不盡然! 當然,C 和 C++ 可能是最適合原始記憶體操作的語言,並且在這裡非常適合,但是在課程中我們學習通用設計演算法,主要關注垃圾收集器和記憶體分配器的理論方面。 這意味著你可以用任何你想要的語言來實現它們。 例如,你可以在 JavaScript 中為一個虛擬 Heap 分配一個 ArrayBuffer,或者類似的在 Python、 Rust 等中分配一個 bytearray。
本課程中的大多數演算法都是用泛型虛擬碼( generic pseudo-code )描述的,因此你可以將它們移植到任何語言中。
https://softnshare.com/essentials-of-garbage-collectors/
同時也有1部Youtube影片,追蹤數超過4萬的網紅史九87 SJ87,也在其Youtube影片中提到,三個你不一定知道的小知識 我想長資識有史以來最輕鬆的主題 😜 👨💻 C 語言的由來 (C++ 為什麼叫做 C++, C# 又是什麼) 👩💻 printf 的 f 到底是什麼意思? 👨💻 為什麼寫程式的人都在那邊 hello world 👉資訊相關👈 ———————————————————...
null c語言 在 紀老師程式教學網 Facebook 的最佳貼文
[熱門文章] 程式設計、重構、與其它任何東西的終極問答
"The Ultimate Question of Programming, Refactoring, and Everything"
網頁版: http://goo.gl/6jIcIp
PDF 版: https://yadi.sk/i/pBZqebxsr5Wyg
#Craftmanships #SoftwareEngineering #CPP #Refactoring #ProgrammingSkills
好的!遲交比不交好,今天的推薦文來了(笑)~
今天介紹這篇,是過去一個禮拜在國外鄉民聚集地 Reddit 程式設計版瘋傳的文章。標題很臭屁「The Ultimate Question of Programming, Refactoring, and Everything」(沒錯!我就在意它最後一個字 "Everything"。咬我啊! XD)。因為轉載的人實在太多,讓我不禁努力地把它看完了。
其實這篇文章講的是 C/C++ 程式寫作者應該注意、或建議遵守的 42 個小訣竅。既不「Ultimate(終極)」,也不是涵蓋「Everthing」。不過裡面還是有不少中肯的建議,所以我還是將它介紹給大家。
為了讓英文苦手的朋友也能稍微感受一下這篇文章在講什麼,所以我不負責任地快速翻譯了每個標題一下。如果對哪個主題有興趣的,就麻煩大家直接對照標題號碼去看原文解說。原文有些標題用「戲謔」或「隱晦」寫法,我若直接翻譯,大家可能不知道原作者想表達什麼。所以我會將某些標題,用比較易懂的中文重新表達。一切以「標題編號(1~42)」為準。
接下來就請享用我這個不負責任的翻譯了。有會錯原文意思的,還請各位留言在下方、然後鞭小力一點 XD。我會馬上修正的:
1. 不要去做編譯器會做的事情
如:用迴圈能存取 a[0] ~ a[9],就不要用「拷貝貼上」a[0], a[1], a[2]..., a[9] 來存取裡面的內容值。
2. 大於 0 不代表它等於 1
若文件告訴你某函數執行成功會傳回「大於0」的值、但目前這個大於0的值是「1」。請你寫程式的時候不要自作聰明地偵測「傳回值 == 1」當成成功,請乖乖遵照規格書用「傳回值 > 0」等於成功。因為將來的版本有可能還會傳回 2, 3...等其他值。
3. 當你拷貝貼上一段程式碼,記得檢查它的副本兩遍
有時候你拷貝貼上一段程式碼,會忘了去修改裡面一些不同的小數字,導致花了大把時間去檢查錯誤到底出現在哪裡。
4. 小心使用「? :」運算子。並記得多加括號
「? :」是 C/C++ 內常用的運算子。若您寫了一段這樣的原始碼「a - b?0:1」,您可能以為它是這樣運作的「a - (b?0:1)」,事實上,它是這樣運作的「(a-b)?0:1」。結論是,多加括號保平安。
5. 多用市面上有的工具來分析您的原始碼
市面上有些工具,如:原始碼靜態分析工具、原始碼排列工具...可以幫您在把原始碼送入編譯器前,就抓到錯誤。不過作者也提到,別以為倚賴這些工具,錯誤就不會發生。真正要減少錯誤還是得靠多讀規格書,增加程式寫作經驗才辦得到。
6. 確認您所有的指標,都已經轉型成整數型態
作者擔心,某些使用 64 bits 當成指標變數寬度的系統,到 32 bits 的機器內重新編譯時,會產生高位元組被截斷的慘劇。某些編譯器提供「uintptr_t」這個專門給指標變數使用的型態,會隨著編譯器所在的環境,自動調整指標寬度。
7. 別在迴圈內呼叫「alloca()」這個函數
萬一迴圈失控,alloca() 函數會霸佔大量記憶體無法釋放。建議事先在迴圈外霸佔一大塊足夠的記憶體,然後在迴圈內慢慢蠶食之。
8. 在「解構函數(Destructor)」內使用「例外處理(Exception)」是很危險的!
作者認為,在負責釋放記憶體、收尾等工作的解構函數,還去霸佔新記憶體作事情是不好的。若真的發生例外(Exception),直接「吃掉(Supress)」不要讓它出現在使用者面前可能還比較好。
9. 若你要比對字串結尾,請用 '\0' 代表
有些程式設計師因為 '\0' 其實就是數字 0,而在比對字串結尾時,直接使用 0 來比對字串結尾。作者認為這個習慣不好。
10. 請勿濫用 # ifdef
# ifdef 很好用,但很容易讓原始碼雜亂難讀。作者不會建議大家不要用,但他反對連可以用 if ~ else 解決的場合,都濫用 # ifdef。
11. 別把一堆運算子全都擠在同一列
多分成幾列,Debugger 可以比較容易指出發生錯誤的是在哪個環節。
12. 當你「拷貝貼上」程式碼時,特別注意「最後一列效應」
作者還是不太建議濫用拷貝貼上,他認為需要重複使用一段程式碼,不如好好考慮寫成稍有彈性的函數,然後重複叫用。此外,他建議大家去看「最後一列效應」這篇文章(連結在本文),並了解最後一列效應在拷貝貼上程式碼內,所扮演的角色。
13. 程式碼若很長,盡量多折幾列,然後排成像表格般一樣整齊(Table-style)
14. 好編譯器 + 好的寫碼習慣是不夠的
內文舉了個後括號「)」括錯位置,但編譯器抓不出來的例子。
15. 若有一堆意義相關的常數,請用 enum 括住它們
16. 「看我能把程式碼寫得這麼屌!」的炫耀寫碼心態不可取
寫程式碼要以「穩」「易讀」為主,不是把一些剛學不久,覺得很酷,但三個月後會忘個精光的技術用進程式碼內。
17. 想用程式碼把一塊資料清乾淨,最好把清除程式碼獨立拉出來成一個專屬函數
18. 你在一個語言行得通的方法,在另一個語言不一定行得通
19. 盡量用技巧避免在同一個類別內,建構函數彼此呼叫的情況
20. 讀檔時,只檢查有沒有讀到檔尾(EOF)似乎是不夠的
21. 正確檢查 EOF 的方法
22. 有比使用 # pragma warning(...) 來印錯誤訊息更好的方法,勿濫用
23. 如果你想取得字串長度,用函數自動幫你算,別用手算然後硬填數字上去
24. 請多使用 "override" 與 "final",它們會是你的好朋友
25. 別再把 "this" 指標跟 "nullptr"(空指標)拿來作比較
26. 小心使用 VARIANT_BOOL 這個陰險狡猾的東西
27. BSTR(Binary STRing)這個用於微軟 COM/Automation 技術中的資料型態,請小心使用
28. 能用函數把一段程式碼包起來重複用,就別用巨集包它(使用巨集函數的缺點多於優點)
29. 在迴圈或迭代程式碼間,使用 ++i,來取代 i++(i++ 編譯後的執行效能稍微差那麼一點)
30. wprintf() 函數的使用陷阱:Win32 印寬字元字串要用 %S(大寫),Win64 要用 %s(小寫)。
31. 陣列在 C/C++ 傳給函數時,並非是「傳值呼叫」(Call by Value)
32. 要把檔案內的文字直接印在螢幕上時,請不要直接使用 printf() (怕檔案內夾雜 % 開頭的字,這些字對 printf 是有特殊意義的)
33. 想對一個指標取值(亦即:*p),記得檢查它是否為 NULL。否則你對 NULL 取值會導致系統出錯的
34. 別以為 int 的上限 21億+ 很多,在 64 bits 系統中,這個數字很容易爆掉
35. 若您把 enum 常數與 switch~case 連用,增加新元素進 enum 時也別忘了加新 case 進 switch
36. 如果有怎麼抓都抓不出來的 bugs,記得往「記憶體」的方向去思考(32bits vs. 64bits 之類的問題)
37. 在 do~while() 內用 continue 指令要小心,有可能會跳過你放在底部的「更新條件」,導致無窮迴圈
38. 對於指標,請用 nullptr 代替 NULL,這是新的 C++ 規格書希望您遵循的
39. 試著別把一列式子搞得太複雜,這樣比較不會有「咦?為何這段寫錯的程式碼居然可以運作」的問題出現
40. 開始使用「原始碼靜態分析工具」吧!
41. 別為了要使用某函式庫的一個函式,而引進整個函式庫。如果只用了一個函式,建議自己寫比較容易維護。
42. 別再用 empty 這個曖昧的字眼當函數名稱了。用 erase(), clear() 都比 empty() 好。
如果您覺得小弟翻譯了這麼多,沒有功勞也有苦勞,那就麻煩按個讚犒賞小弟一下吧!當然歡迎轉發給您 Facebook 的朋友共同討論。最後提醒一句,上述 42 點別把它們全都當聖旨,親身體會驗證才是最重要的喔!
祝福大家假期愉快!
null c語言 在 人助旅行與助人旅行 Facebook 的最佳解答
台灣工程師常唸錯的英文單字
http://priv.tw/blog/archives/591
你有自信能念對幾個呢?
----
access /ˈækses/ 重音在第一音節不在第二音節,還有中間有一個k常常也被忘記了。
administrator /ədˈmɪnəstreɪtər/ 第二音節是重音不是次重音,不要念成和 administration /ədˌmɪnəˈstreɪʃən/ 一樣的發法。
architecture /ˈɑːrkətektʃər/ 注意重音在第一音節不是第三音節。 (Freddy 提供)
cache /kæʃ/ 千奇百怪的唸法就不想提了,它和 cash (現金)同音才對。
cancel /ˈkænsəl/ 有少部份人會把它唸成 cancer…就錯囉,cancer 是癌症的意思。小小一個子音的差異,意思卻相去甚遠。
confirm /kənˈfɜ:rm/ confirm(?)以及 Netkidz 提供,許多人會唸成 conform /kənˈfɔ:rm/。
distributed /dɪˈstrɪbju:tɪd/ ericyu 提供,沒提我都快忘了,重音在tri而不是bu,台灣人很容易發成和distribution /ˌdɪstrɪˈbju:ʃən/ 一樣的重音,十幾年前在大學的時候我自己也是花了一番工夫才校正過來。
feature /ˈfi:tʃər/ 唸成 fee-ture phone,不要再唸成 future phone 了。
format /ˈfɔ:rmæt/ 重音第一音節,發音上沒有分名詞動詞,動詞用法「format C槽」的 format 重音還是該在第一音節。
illustrator /ˈɪləstreɪtər/ 重音在第一音節,但是很多人就是會唸成「以拉-」。
infrastructure /ˈɪnfrəˌstrʌktʃər/ 繼續重音更正,重音真的很重要。
null /nʌl/ 請不要發「怒偶」,他沒有怒。
maintenance /ˈmeɪntənəns/ visual 提供,這個我不曉得要怎樣形容,可是唸錯的人也很多,大家自行服用 M-W 的線上發音吧。
modem /ˈmoʊdəm/ 重音在第一音節。
parameter /pəˈræmətər/ 重音在第二個音節,不要唸成 para + meter。
percent /pərˈsent/ 重音在第二音節,這個字最早是從 “per cent”,唸成 person 就會讓人聽不太懂了。(提供:kk、KOD)
power /ˈpaʊr/ 後半不是唸 wer 喔,並不存在 w 半母音。pow 後面直接接 r 子音。就算不同腔調,想要唸清楚、重一點也是 pow + er /ˈpaʊər/才對。
processor /ˈprɑ:sesər/ biou 提供。重音在第一音節,而不是在ce,這比較奇怪的地方是 process 相對來說唸錯的人就比較少。推測可能受到 professional/professor 這些字的影響。
programmer /ˈproʊɡræmər/ program, programmer, programming 的重音都應該在第一音節而不是第二音節。(KOD 提供)
standard /ˈstændərd/ Joy 網友提供,standard 的 ar應該唸成像 teacher 的 er,而不是 car 的 ar。
suite /swiːt/ 音同 sweet,套房、套裝軟體等等。這個字唸錯其實也難怪,因為它長得和 suit /suːt/ (西裝)真的很像,意義上也很像。而且實際上,suite 和 suit 的法文字源還真的是一樣的,只是後來英國人才慢慢把這兩個字區分使用方法和讀音。某些字典裡面如 m-w 也有將 suite 列出/suːt/ 的讀音,不過畢竟這是比較不常見的唸法。大家還是努力改正吧。
variable /ˈveriəbəl/ 重音第一音節,含起來比較像 very-able 而不是像 variety 的前面。
word /wɜ:rd/ 這麼簡單的字,音標也清清楚楚,但是至少五成以上的台灣人念錯,甚至包括一些中學學校、補習班老師都唸錯。or 前面若是 w 要弱化成 bird 中 ir 的發音,請和我唸一遍,word。
walk /wɒ:k/ walk「沒有l」的音,不要再唸錯了。
---
有些人說,語言就是要拿來溝通的,聽得懂就好了!問題是台灣人自己聽得懂自己的英文,外國人聽不懂台灣人的英文阿!
有人說,印度人講英文不標準,還不是可以溝通。
那你搞錯了一點,印度人說英文雖然口音很重,但是發音是正確的。
發音正確,有口音還是聽得清楚,發音錯誤那就...
來看怎麼正確發音:
【你的問題不是口音,而是發音!】
http://fairyseyes.blogspot.tw/2013/10/blog-post_1732.html
我是苡絃,這裡是人助旅行
讓我們一起交朋友、玩世界!
https://www.facebook.com/fairyseyes
null c語言 在 史九87 SJ87 Youtube 的最佳解答
三個你不一定知道的小知識
我想長資識有史以來最輕鬆的主題 😜
👨💻 C 語言的由來 (C++ 為什麼叫做 C++, C# 又是什麼)
👩💻 printf 的 f 到底是什麼意思?
👨💻 為什麼寫程式的人都在那邊 hello world
👉資訊相關👈
————————————————————————
● 面試祕笈!絕不藏私!軟體工程師的面試技巧 我想長資識 E03 https://youtu.be/UxmlFsQFqx4
● 2019 年最令人期待的手機? Pixel 4 曝光!來自 Google 的技術結晶 https://youtu.be/fppqZnZAZQM
● Null 不是唸「怒嘔」?工程師常常唸錯的單字 我想長資識 E02 https://youtu.be/1YEcEQw0vGA
● 韌體是什麼? 4分鐘!讓你認識軟體硬體與韌體 我想長資識 E01 https://youtu.be/ZHWsHUEz4qk
————————————————————————
👉追蹤我們👈
————————————————————————
史九87 IG ► https://www.instagram.com/im9vv
史九87 FB ► https://www.facebook.com/shihjo87
商業合作請洽詢 ► shihjo87@gmail.com
信箱箱址中文:
24199
三重忠孝路郵局第 88 號信箱
信箱箱址英文:
P.O.BOX 88 Sanchong Zhongxiao Road
New Taipei City 24199
Taiwan (R.O.C)
————————————————————————
