溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)

發(fā)布時間:2021-12-14 16:24:10 來源:億速云 閱讀:175 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)”,在日常操作中,相信很多人在C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

什么是內(nèi)存池?

頻繁的調(diào)用 malloc 會影響運行效率以及產(chǎn)生額外的 cookie, 而內(nèi)存池的思想是預(yù)先申請一大塊內(nèi)存,當有內(nèi)存申請需求時,從內(nèi)存池中取出一塊內(nèi)存分配給目標對象。

它的實現(xiàn)過程為:

預(yù)先申請 chunk 大小的內(nèi)存池, 將內(nèi)存池劃按照對象大小劃分成多個內(nèi)存塊。以鏈表的形式,即通過指針將內(nèi)存塊相連,頭指針指向第一個空閑塊。當有內(nèi)存申請需求時,首先檢查頭指針是否指向空閑塊,如果是則將頭指針指向的第一個空閑塊分配出去(從鏈表移除),同時頭指針指向下一個空閑塊;若頭指針為空,說明當前內(nèi)存池已分配完,需要重新申請新的內(nèi)存池。當有內(nèi)存釋放需求時,將釋放的內(nèi)存塊重新加入鏈表的表頭,調(diào)整頭指針指向新加入的空閑塊。這也意味著,如果申請了多個內(nèi)存池,在內(nèi)存釋放的過程中會慢慢的合并到一起。

初步實現(xiàn)

C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)

在上面的代碼中設(shè)置一個內(nèi)存池為5個內(nèi)存塊,當我們進行100次內(nèi)存申請后,打印出前10個地址查看,可以看到前5個地址是連續(xù)的,后5個也是連續(xù)的,但中間由于重新申請了內(nèi)存池,所以不是連續(xù)的。

C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)

但是這樣的方法還存在著問題,那就是引入了額外的指針內(nèi)存消耗,接下來將使用embedded pointer進行改進。

使用嵌入指針改進

C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)

上面就使用到了嵌入指針,一個 AirplaneRep 對象的大小為 8 字節(jié),而一個 Airplane 的指針大小為 4 字節(jié)或 8 字節(jié)。在 32 位機器下, 指針可以借用 AirplaneRep 對象所占的 8 字節(jié)內(nèi)存空間中的前 4 個字節(jié),用來連接空閑的內(nèi)存塊。而當內(nèi)存塊需要被分配給對象時,此時它已從鏈表中移除,也就不需要指針來連接了。此時的 8 字節(jié)內(nèi)存空間由 AirplaneRep 占據(jù)。當內(nèi)存釋放時也是同理,由于 Rep 和 next 不會同時用到,所以 embedded pointer 的做法可以減少內(nèi)存消耗。

更簡化:static allocator

前面的實現(xiàn)需要為每個類都重寫 operator new 和 operator delete,由于內(nèi)容是一樣的,使用另一個類來完成這些重復(fù)的操作。

C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)

C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)

如此一來,我們的 class 只需要去調(diào)用 allocator 即可完成內(nèi)存的申請和釋放工作。

macor for static allocator

在上面的 Foo 和 Goo 中,每次還要寫一大堆重復(fù)的內(nèi)容,于是可以使用宏進一步簡化:

C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)

到此,關(guān)于“C++內(nèi)存管理中簡易內(nèi)存池怎么實現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI