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

正文內容

c內存池設計-展示頁

2025-07-26 10:52本頁面
  

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