2013-07-05 65 views
1

我一直在尋找SDL & Quake(1/2)源代碼,我想知道爲什麼編程人員需要實現他們自己的malloc? (我認爲SDL_malloc僅供內部SDL使用)。 又如何?爲什麼人們如何實現他們自己的malloc?

做好本職功能調用C的malloc在堆上分配一個巨大的塊,然後有管理自己的記憶?或者,也許他們靜態地分配一個巨大的數組(但是失去了靈活性)?

這是我最感興趣的內容(也適用於普通的malloc):他們只是自己管理堆?如果是這樣,他們怎麼知道堆的開始和結束在內存中?他們將如何要求更多/更少的堆應用程序?

我問這個問題,因爲我很感興趣,我實現自己的分配器的業餘愛好項目。

+0

您可能想要爲您的項目添加更多關於爲什麼需要這些信息的詳細信息,因此該問題看起來不像「閒散的好奇心」。 –

+0

當你甚至不知道做什麼的動機時,對做某事感興趣似乎很奇怪。如果對已經研究過的東西感興趣,然後在遇到障礙時提問,會更有意義。 –

+0

我這樣做只是爲了好玩,但我在問爲什麼像Quake這樣的專業軟件開發人員放下時間,可以用來推進他們的遊戲,並用它來利用自己的內存分配器。 – hddh

回答

7

我實現我自己的內存分配程序,以實現「虛擬內存」的my postscript interpreter。我需要通過C標準malloc無法提供的額外功能(如垃圾回收)。它開始作爲一個簡單的「區域」分配器,這不是太困難(使用標準realloc增長該地區)。

C是也許不是試圖做到這一點,因爲它可以將指針的使用複雜的最佳語言。使用C++,你可以創建一個新的「託管指針」類,所以你的實際用法仍然看起來很正常。


對於像Quake這樣的遊戲,99%的「爲什麼他們這樣做(這樣)」的答案?問題是性能。更多幀/秒,更多細節/幀,更快的響應。他們不需要standard allocator that uses linked-lists of metadata,因爲他們無法承受遍歷列表的時間,所以他們使用散列表(或者甚至更狂野)編寫自己的代碼。

4

在過去,我實現我自己的malloc()(或其他語言的等價物)作爲最後的手段措施,追查有害內存相關的錯誤。由於存在良好的內存診斷和語言,因此放棄使用指針,現在不太需要這樣做。

在我的情況下,我沒有完成整個工作 - 我用malloc()將請求的內存分配包含了圍欄數據,幻數,分配序列或時間信息等,以幫助診斷錯誤,然後調用系統malloc()實際分配內存。

因此,呼叫p = my_malloc(nbytes),可能會產生這樣的內存塊:

FF00FF00 <leading fence> 
<timestamp> 
<allocation sequence number> 
<allocation size> 
nbytes of space <this is the block of memory that p will point to> 
FF88FF88 <trailing fence> 

...,也將寫一些診斷信息的日誌文件。然後

呼叫my_free(p)將檢查圍欄,時間戳,序列號等,並沒有被破壞釋放所有my_malloc()分配的內存之前(之前和之後的塊通過p指出)。 my_malloc()my_free()通常還會將一些診斷信息寫入日誌文件,以便讓我匹配分配和取消分配並查找內存泄漏的來源。當然,每次分配內存或取消分配時寫入日誌文件都會使程序減慢很多。我經常把日誌文件放在RAM磁盤上來解決這個問題。

相關問題