freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c內(nèi)存池設計(已修改)

2025-07-31 10:52 本頁面
 

【正文】 C++內(nèi)存池設計 在項目中進程要對變量和對象分配空間,由于頻繁的使用 new 和 delete 很消耗程序的運行時間,而且容易產(chǎn)生各種內(nèi)存泄露,內(nèi)存釋放錯誤等問題。為此,需要設計一個通用的內(nèi)存池來完成相關的分配和釋放的工作。 建立內(nèi)存池 : 首先向系統(tǒng)申請一塊內(nèi)存,這塊內(nèi)存的大小由使用者根據(jù)需要設置初始內(nèi)存大小。 M E M O R Y B L O C K向 系 統(tǒng) 申 請 的 內(nèi) 存 定義一個如下面代碼所示的雙向鏈表,將從系統(tǒng)分配的內(nèi)存分為若干塊。使用雙向鏈表方便指針向前和向后遍歷查找。 鏈表中 *Data 指 向了系統(tǒng)分配的內(nèi)存, pUser 使用二級指針保存了內(nèi)存申請者的地址,方便以后系統(tǒng)內(nèi)存塊更改,改變申請者的指向。后面會詳細介紹。將雙向鏈表指向指向內(nèi)存如下所示: 系 統(tǒng) 分 配 的 內(nèi) 存 塊H e a d4 0 0 3 0 0 2 0 0 1 0 0N U L LDATEDATEDATEDATE 假設內(nèi)存池初始塊數(shù)為 4 塊,每塊的大小為 100 個字節(jié),則向系統(tǒng)申請 400 個字節(jié)的內(nèi)存塊,每塊的大小為 100 字節(jié)。之后使用雙向鏈表 DATA 指針指向內(nèi)存塊,每個指針能分配的大小如圖所示從大到小遞減。 對象內(nèi)存分配 : 對內(nèi)存的鏈表指針分配好后,用戶可以使用內(nèi)存池進行內(nèi)存分配,對于用戶的內(nèi)存分配有兩種 情況,一種是在現(xiàn)有的內(nèi)存池中能找到合適的內(nèi)存塊,另一種情況是現(xiàn)有內(nèi)的內(nèi)存池沒有足夠的內(nèi)存塊來分配,需要重新向系統(tǒng)申請內(nèi)存來滿足用戶的需求。下面分別就這兩種內(nèi)存分配情況進行說明: 情況 1 內(nèi)存池有足夠的內(nèi)存塊進行分配 系 統(tǒng) 分 配 的 內(nèi) 存 塊H e a d4 0 0 3 0 0 2 0 0 1 0 0N U L LDATEDATEDATEDATE被 使 用被 使 用 被 使 用未 分 配 假設用戶申請了 240 個字節(jié)的內(nèi)存空間,內(nèi)存池現(xiàn)在有四個內(nèi)存塊空閑,每個內(nèi)存塊的大小為 100 字節(jié),那么內(nèi)存池將會給用戶取整分配三個內(nèi)存塊。如上圖所示,并將指向 400內(nèi)存塊的指針的 DATE 返回給用戶使用。 情況 2 內(nèi)存池沒有足夠的內(nèi)存塊 進行分配 接著上圖,假設用戶現(xiàn)在要接著分別 300 字節(jié)的內(nèi)存空間,現(xiàn)有內(nèi)存池的大小已經(jīng)不能滿足,因此需要擴大現(xiàn)有的內(nèi)存池使用大小。 考慮到由于分配給用戶的內(nèi)存空間必須要是連續(xù)的內(nèi)存塊,因此這個連續(xù)的內(nèi)存塊越大,能分配給用戶的內(nèi)存就多。因此使用 C 語言的realloc 函數(shù)來滿足要求。 函數(shù)簡介 原型: extern void *realloc(void *mem_address, unsigned int newsize)。 語法:指針名 =( 數(shù)據(jù)類型 *) realloc(要改變內(nèi)存大小的 指針 名,新的大?。?。 //新的大小一定要大于原來的大小,不然的話會導致數(shù)據(jù)丟失! 頭文件: include 有些編譯器需 要 include ,在 中可以使用 頭文件 功能:先判斷當前的指針是否有足夠的連續(xù)空間,如果有,擴大 mem_address 指向的地址,并且將 mem_address 返回,如果空間不夠,先按照 newsize 指定的大小分配空間,將原有數(shù)據(jù)從頭到尾拷貝到新分配的內(nèi)存區(qū)域,而后釋放原來 mem_address 所指內(nèi)存區(qū)域(注意:原來指針是自動釋放,不需要使用 free),同時返回新分配的內(nèi)存區(qū)域的首地址。即重新分配存儲器塊的地址。 返回值:如果重新分配成功則返回指向被分配內(nèi)存的 指針 ,否則返回空指針 NULL。 系 統(tǒng) 分 配 的 新 內(nèi) 存 塊H e a d4 0 0 3 0 0 2 0 0 1 0 0N U L LDATEDATEDATEDATE被 使 用被 使 用 被 使 用未 分 配 未 分 配 未 分 配新 內(nèi) 存 在 原 有 的 內(nèi) 存 空 間 擴 充 , 或 者 在 其 它 地 方 新 分 配 一 塊 內(nèi) 存 。 原 有 指 針 有 失 效的 風 險 , 并 且 原 有 得 到 內(nèi) 存 的 對 象 也 可 能 失 效 。 由 realloc 函數(shù)定義可知,新分配的內(nèi)存空間可能是在原有的內(nèi)存基礎上擴充,還有可能是在另外的一個地方新開辟一塊內(nèi)存。無論哪種情況多要對新加的內(nèi)存進行指針指向分配。并且對于第二種情況,會出現(xiàn)的問題是原有的指針全都失效。因為原有指向的內(nèi)存已經(jīng)不存在了,因此指向它的指針將失效,原有分配的對象 也將失效。為了解決這個問題,在新分配內(nèi)存后需要重定向原有的指針,并且使用二級指針改變已經(jīng)分配了對象的地址的指向,使它指向新內(nèi)存。 重定向原有內(nèi)存的指針的指向,和已經(jīng)分配了內(nèi)存的對象的指向。 對象釋放內(nèi)存 : 系 統(tǒng) 分 配 的 內(nèi) 存 塊H e a d3 0 0 2 0 0 1 0 0 1 0 0N U L LDATEDATEDATEDATE釋 放 內(nèi) 存被 使 用釋 放 內(nèi) 存釋 放 內(nèi) 存 假如先前的申請了 250 個字節(jié)分配了三個內(nèi)存塊的用戶釋放了內(nèi)存,這時鏈表指針向后查找直到找到第一個被使用的內(nèi)存塊,或鏈表結(jié)尾。之后在先前查找直到找到前面第一個被使用的內(nèi)存塊或者是頭指針,之后更新這個區(qū)間段內(nèi)存塊的大小。 釋放內(nèi) 存池 : 首先釋放向系統(tǒng)申請的內(nèi)存塊,之后在清空所有的雙向鏈表。 釋放向系統(tǒng)申請的內(nèi)存 釋放雙向鏈表。 后續(xù)改進 : 1, 需要對多線程的支持,目前的內(nèi)存池還只能在單線程的環(huán)境下運行。 2, 如果之前得到內(nèi)存的對象,在新內(nèi)存分配前有指針復制操作,原有對象可以通過保存的指針地址進行重定向,但是之前分別的對象不能保證。引進對于分配的對象盡量不要使用指針復制。如果一定需要這么做,那就在每次使用前,在重定向一下。重新進行一次復制操作 (保險起見,不知道我的表述是否清楚明白) 。 源代碼 : 頭文件鏈表節(jié)點的定義 includestring includeiostream include include using namespace std。 namespace MemePool { typedef unsigned char EigthByte。 //內(nèi)存池的默認大小和分配節(jié)點的默認大小 static const size_t DEFAULTMEMEPOOLSIZE = 1000。 static const size_t DEFAULTMEMENODESIZE = 100。 //內(nèi)存初始分配內(nèi)容 二進制位 1111 1111 static const int NEW_ALLOCATED_MEMORY_CONTENT = 0xFF。 //內(nèi)存分配節(jié)點(雙向鏈表) typedef struct TMemeNode { //指向前一節(jié)點 TMemeNode *first。 //指向后一節(jié)點 TMem
點擊復制文檔內(nèi)容
研究報告相關推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1