欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++內(nèi)存管理之簡易內(nèi)存池的實現(xiàn)

 更新時間:2021年12月14日 14:32:15   作者:Kayden_Cheung  
大家好,本篇文章主要講的是C++內(nèi)存管理之簡易內(nèi)存池的實現(xiàn),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下

什么是內(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)

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

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

使用嵌入指針改進

上面就使用到了嵌入指針,一個 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ù)的操作。

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

macor for static allocator

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

到此這篇關(guān)于C++內(nèi)存管理之簡易內(nèi)存池的實現(xiàn)的文章就介紹到這了,更多相關(guān)C++內(nèi)存池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)保存數(shù)據(jù)至EXCEL

    C++實現(xiàn)保存數(shù)據(jù)至EXCEL

    這篇文章主要介紹了C++實現(xiàn)保存數(shù)據(jù)至EXCEL,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • c++ 有趣的動態(tài)轉(zhuǎn)換

    c++ 有趣的動態(tài)轉(zhuǎn)換

    這篇文章主要介紹了c++ 動態(tài)轉(zhuǎn)換的相關(guān)資料,幫助大家更好的理解和使用c++編程,感興趣的朋友可以了解下
    2020-09-09
  • C語言實現(xiàn)線性動態(tài)(單向)鏈表的示例代碼

    C語言實現(xiàn)線性動態(tài)(單向)鏈表的示例代碼

    本文主要介紹了C語言實現(xiàn)線性動態(tài)(單向)鏈表的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C++讀取wav文件中的PCM數(shù)據(jù)

    C++讀取wav文件中的PCM數(shù)據(jù)

    這篇文章主要為大家詳細介紹了C++讀取wav文件中的PCM數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++ OpenCV學習之圖像像素值統(tǒng)計

    C++ OpenCV學習之圖像像素值統(tǒng)計

    在圖像分析的時候,我們經(jīng)常需要對單通道圖像的像素進行統(tǒng)計。本文將主要介紹利用C++ OpenCV實現(xiàn)的圖像像素值統(tǒng)計的幾種方法,需要的可以參考一下
    2022-01-01
  • C++實現(xiàn)LeetCode(66.加一運算)

    C++實現(xiàn)LeetCode(66.加一運算)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(66.加一運算),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • VS2017開發(fā)C語言出現(xiàn)“no_init_all“的解決辦法

    VS2017開發(fā)C語言出現(xiàn)“no_init_all“的解決辦法

    這篇文章介紹了VS2017開發(fā)C語言出現(xiàn)“no_init_all“的解決辦法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C語言二叉樹層序遍歷

    C語言二叉樹層序遍歷

    這篇文章主要介紹了C語言二叉樹層序遍歷,文章基于C語言的相關(guān)資料展開詳細的文章內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-04-04
  • C/C++ 實現(xiàn)遞歸和棧逆序字符串的實例

    C/C++ 實現(xiàn)遞歸和棧逆序字符串的實例

    這篇文章主要介紹了C/C++ 實現(xiàn)遞歸和棧逆序字符串的實例的相關(guān)資料,這里提供實例代碼幫助大家學習掌握,需要的朋友可以參考下
    2017-08-08
  • 最新C語言中g(shù)etchar的使用

    最新C語言中g(shù)etchar的使用

    getchar()是在輸入緩沖區(qū)順序讀入一個字符(包括空格、回車和Tab) ,getchar()是stdio.h中的庫函數(shù),它的作用是從stdin流中讀入一個字符,本文給大家介紹getchar的使用,感興趣的朋友跟隨小編一起看看吧
    2022-12-12

最新評論