magic_no,好方法!
假設我們有了一大塊緩衝區(以下稱buffer),say,1m,這一塊緩衝區將用來滿足很多小的順序到來的記憶體請求,並且,其釋放先後次序和申請次序一致。我們可以考慮採用環形佇列來解決這個問題。為了記錄分配出去的記憶體塊(以下稱buflet)的大小、狀態等資訊,需要對記憶體區進行管理,採用如下策略:
(1)每一小塊記憶體頭部劃分出一小片來記錄這塊記憶體的大小、狀態,剩餘部分供給使用者使用。
(2)對於新的請求,首先檢視當前空閒池是否能夠滿足需求,如果不能滿足,就往前檢視,合併可**的記憶體區到空閒池(適用於回環了一周的記憶體使用狀況,首次分配不存在該問題),然後進行分配。分配時,新區域可能比使用者需要的區域大,此時需要執行split操作,僅僅將使用者需要的記憶體切割出去,剩餘的放入空閒池。
(3) 使用者歸還記憶體時將記憶體塊標記為free
如下圖所示:
如何及時發現這種錯誤?不要說仔細地寫**,因為,在程式設計師心中,有個概念必須牢記:軟體錯誤是無法避免的。在一塊記憶體區上,任意位置都可以是乙個buflet的起始,當我們得到乙個錯誤的指標時,它表面上看也可以是乙個buflet位址,實際上確實錯誤的。這個錯誤無法直接檢測!這個問題麻煩了我三四個小時後,終於不堪忍受了,想出使用magic_no的方法:每生成乙個buflet的時候,在其頭結構中加入乙個magic number。每次通過現有指標計算分配乙個buflet時,我們就檢查magic number域,如果magic number等於某個確定值magic_no,則表明指標偏移正確,否則報錯,讓我們知道指標又錯了,反過來及時修改**。
#definemagic_no0x4d544c/**typedef
struct_dfs_api_res_pkt_t
dfs_api_res_pkt_t;
1#include
23#definemagic_no0x4d544c/**4unionmx;
8intmain() 910
~
數學函式在程式設計中的應用
在工作中遇到這樣乙個問題 某些資料要分n頁列印,但是在所有但資料頁的前面要列印一張封皮 bg1 然後列印一張公共資訊 bg2 後面是資料 bg3 最後還要列印一張統計資訊 bg4 比如說 有50組資料,每張報告打10組,就要分5張報告列印,也就是說,先打一張封皮,再打一張公共資訊,然後打5張資料的報...
如何在程式設計中節約系統記憶體
程式語言為現代的計算和自動化作出了重要貢獻!能運用程式語言解決現實中的問題,你會發現,其實很多事情真的很方便!前段時間一直跟他們測量的講解cass這個軟體,我並沒有學過這個軟體,但是從它的安裝和使用,我發現其實就是基於cad的乙個二次開發!如果有足夠的條件,我們也可以開發出類似於cass這樣的軟體,...
如何在程式設計中節約系統記憶體
程式語言為現代的計算和自動化作出了重要貢獻!能運用程式語言解決現實中的問題,你會發現,其實很多事情真的很方便!前段時間一直跟他們測量的講解cass這個軟體,我並沒有學過這個軟體,但是從它的安裝和使用,我發現其實就是基於cad的乙個二次開發!如果有足夠的條件,我們也可以開發出類似於cass這樣的軟體,...