謎之音評空管唔夠ram:「而家香港搞成咁,合理嚟講,大家應該從貪污角度去諗呢件事。」
【大香港早晨】
第852集:五桂山謀殺案 報紙有幾多係事實?/ 空管系統上限4GB Ram?! 謎之音拆解玄機/ 操守崩壞 民航職員撻朵獲禮待/ ICQ因劇集咸魚翻生 掀厚面皮約會情懷
節目連結︰http://www.passiontimes.hk/prog/85/852
主持:陳四、譚仔、Joey Tse
嘉賓:謎之音(IT達人)
新空管系統自去年啟用後問題頻生,甚至於三月更新後仍不斷錯誤。而近日傳真社更揭發新空管的「電子紙條系統」採用較落後的32位元格式,令應用記憶體上限局限於4GB,若系統用量超過2.5GB則可能導致系統故障。處方的解決方法,就是令53台工作席每一至兩週重新啟動一次。
本台IT達人謎之音認為空管系統使用32位元並非不合理,因為空管系統著重穩定多於速度,一般而言這類作業系統能夠以年計運作而不須重新啟動。因此即使系統使用32位元,頻密地重新啟動的要求實屬極不合理,所以唯一解釋就是程式設計不良。民航處花費15億購入千瘡百孔的新空管系統,嚴重影響香港航空安全,令公眾傾向相信事件有涉及貪污的可能。
首播日期:2017-05-30
Facebook Group:
https://www.facebook.com/groups/427417430725690/
32位元程式記憶體上限 在 紀老師程式教學網 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 點別把它們全都當聖旨,親身體會驗證才是最重要的喔!
祝福大家假期愉快!
32位元程式記憶體上限 在 在64位元的WIN7中,32位元的程式能使用到超過4G以上的 ... 的美食出口停車場
小弟的疑問是,OS能定址到,但32位元程式不見得能使用得到吧? 或者是我的誤解,求大師解說. x64 win7 本來就能使用超過4GB 主記憶體 根用 ... ... <看更多>
32位元程式記憶體上限 在 黑暗執行緒- 大家都知道 的美食出口停車場
大家都知道,32 位元.NET 程式最多只能用到1.6GB 左右的記憶體,同事分享了一記密技,瞬間讓32 位元.NET 程式吃到3GB,讓我不禁獻上了膝蓋, ... ... <看更多>
32位元程式記憶體上限 在 [閒聊] 楓之谷將不適合32位元作業系統- 看板MapleStory 的美食出口停車場
單純從記憶體的觀點來看
(文末提供個32bit-OS黑螢幕、伺服器連接中斷可能的解決方法)
#1NQiY9tJ 這篇提及這次改版後,記憶體使用量爆增的問題
週末掃過里程BOSS,最誇張的時候工作管理員顯示250萬K的使用量
這意味著光是楓之谷一個程式,可能會吃光整個32位元作業系統的閒置記憶體
稍微有電腦知識的人應該知道,32位元有個大概3~3.5G的記憶體上限
不了解的人也可以在 電腦->右鍵->內容 的地方看到,系統欄位那邊
ex 安裝的記憶體(RAM): 4.00GB (3.25GB可用)
表示雖然這台電腦我裝了4G的記憶體,但實際上可用的只有3.25G而已
可用量可能因為不同電腦上的其它設置而有些微差異
雖然有方法可讓32位元系統突破他應有的記憶體上限,但不在一般討論範圍
#1NQiY9tJ 這篇的後續故事是這樣的
補回了壞掉的2G記憶卡,發現情況完全沒有改善 (電腦是win7 32位元)
打開楓之谷的時候還是有可能中途斷線、與伺服器連接中斷
就算成功進入選角畫面,會有奇怪的破圖現象
角色卡、打工、新星世界、進入遊戲等等幾個按鈕沒有顯示出來
選角ENTER進入遊戲之後,背景破圖般的黑、音樂沒有切換
接著開始先嘗試弄些現有的無法登入時常用的解決方法
windows更新、重灌、硬碟重組、掃毒、楓之谷的調整頻率
忙了一兩天後,情況還是完全沒變、就是有奇怪的破圖
既然可以登入,但卻有奇怪的破圖現象
最後朝著記憶體不足、或是記憶體限制的方向思考
於是google一下「windows 單一程式記憶體上限」之類的很快就有了答案
相關討論很多
https://forum.gamer.com.tw/C.php?bsn=08115&snA=232
https://tw.answers.yahoo.com/question/index?qid=20140708000015KK11059
https://www.focus-sport.club.tw/viewthread.php?tid=315897
https://www.ptt.cc/bbs/C_and_CPP/M.1241680874.A.543.html
bcdedit /set IncreaseUserVa 3072
去微軟官網尋找文章中提到的這條 bcdedit 指令
https://msdn.microsoft.com/en-us/library/ff542202.aspx
On 32-bit editions of Windows, applications have 4 gigabyte (GB) of virtual
address space available. The virtual address space is divided so that 2 GB
is available to the application and the other 2 GB is available only to the
system.
雖然說32位元作業系統提供單一程式執行的虛擬記憶體上限是2GB
但事實上要完整且順利地執行楓之谷,門檻要更高
我電腦到帳密畫面時記憶體是113萬K、選角進入後是140萬K,還不到2GB慘遭破圖
可能還跟楓之谷另外兩個防掛軟體的互動、或是背後檔案的讀取有關係
至於win7之後的64位元正常來說應該不會碰上這個2GB限制的問題
vista之前的64位元則還是有這個問題
https://wiki.mcneel.com/zh-tw/rhino/memorylimits
https://msdn.microsoft.com/en-us/library/bb613473.aspx
而 Windows Server 2003 之前的版本只能手動修改開機設定檔 boot.ini
詳細方法參考連結,以後的版本才可用指令設定
手邊是64位元的人想嘗試可以試試,前項指令所作設定是可以取消的
bcdedit /deletevalue IncreaseUserVa 即可清除前項指令的設定
最後在我電腦上的結果,問題大多解決了
雖然開啟楓之谷的時候偶爾還是會中途與伺服器連線中斷
不過正常來說都可以順利開啟
選角畫面、以及進入遊戲後的畫面都沒有破圖、音樂有正常切換
看來取得了足夠的記憶體,結束了這次改版的折騰
給直接END的結論
因應改版後楓之谷佔用記憶體爆增問題,某些作業系統必須要
修改單一程式記憶體上限2GB的設定 (事實上只是增加到3GB而已)
Windows7之後的64位元版本,應該不會有這個問題
對於Windows7 32位元、或更以前的32/64位元版本
Windows Server 2003 之前的版本,手動修改開機設定檔 boot.ini (參考連結)
Windows Server 2003 以後的版本,進行以下簡單的操作
(1) 打開命令提示字元,或是搜索「cmd.exe」 (右鍵以系統管理員身分執行)
(2) 輸入 bcdedit /set IncreaseUserVa 3072
(3) 看到操作順利完成後,重新開機
(方法有賺有賠,操作前應詳閱指令說明或確保個人電腦有無其它設定)
2D的楓之谷可以吃爆記憶體,簡直是2D遊戲界的肥宅
假如未來還是一直增加,突破3GB的那天將宣告楓之谷只能跑在64位元作業系統
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 117.56.245.32
※ 文章網址: https://www.ptt.cc/bbs/MapleStory/M.1467002445.A.9B1.html
最近手邊有台九年的 WINXP 32位元 主機版壽終正寢了 XDDD
的確該投入64位元的懷抱,等新桌機來就要裝 WIN7 64位元
希望8GB的記憶體足夠迎接未來華麗的五轉技能
至於文中這台五年的 WIN7 32位元,暫時沒有打算更換
... <看更多>