網站首頁 編程語言 正文
什么是內存池?
頻繁的調用 malloc 會影響運行效率以及產生額外的 cookie, 而內存池的思想是預先申請一大塊內存,當有內存申請需求時,從內存池中取出一塊內存分配給目標對象。
它的實現過程為:
預先申請 chunk 大小的內存池, 將內存池劃按照對象大小劃分成多個內存塊。以鏈表的形式,即通過指針將內存塊相連,頭指針指向第一個空閑塊。當有內存申請需求時,首先檢查頭指針是否指向空閑塊,如果是則將頭指針指向的第一個空閑塊分配出去(從鏈表移除),同時頭指針指向下一個空閑塊;若頭指針為空,說明當前內存池已分配完,需要重新申請新的內存池。當有內存釋放需求時,將釋放的內存塊重新加入鏈表的表頭,調整頭指針指向新加入的空閑塊。這也意味著,如果申請了多個內存池,在內存釋放的過程中會慢慢的合并到一起。
初步實現
在上面的代碼中設置一個內存池為5個內存塊,當我們進行100次內存申請后,打印出前10個地址查看,可以看到前5個地址是連續的,后5個也是連續的,但中間由于重新申請了內存池,所以不是連續的。
但是這樣的方法還存在著問題,那就是引入了額外的指針內存消耗,接下來將使用embedded pointer進行改進。
使用嵌入指針改進
上面就使用到了嵌入指針,一個 AirplaneRep 對象的大小為 8 字節,而一個 Airplane 的指針大小為 4 字節或 8 字節。在 32 位機器下, 指針可以借用 AirplaneRep 對象所占的 8 字節內存空間中的前 4 個字節,用來連接空閑的內存塊。而當內存塊需要被分配給對象時,此時它已從鏈表中移除,也就不需要指針來連接了。此時的 8 字節內存空間由 AirplaneRep 占據。當內存釋放時也是同理,由于 Rep 和 next 不會同時用到,所以 embedded pointer 的做法可以減少內存消耗。
更簡化:static allocator
前面的實現需要為每個類都重寫 operator new 和 operator delete,由于內容是一樣的,使用另一個類來完成這些重復的操作。
如此一來,我們的 class 只需要去調用 allocator 即可完成內存的申請和釋放工作。
macor for static allocator
在上面的 Foo 和 Goo 中,每次還要寫一大堆重復的內容,于是可以使用宏進一步簡化:
原文鏈接:https://www.cnblogs.com/zyb993963526/p/15684908.html
相關推薦
- 2022-11-07 python學習pymongo模塊的使用方法_python
- 2022-10-26 如何查看git分支從哪個源分支拉的_相關技巧
- 2022-03-26 jquery對元素的基本操作實例分析_jquery
- 2022-07-18 SQL?Server中的文本函數和圖像函數介紹_MsSql
- 2022-11-07 MongoDB?C?驅動程序安裝(libmongoc)?和?BSON?庫(libbson)方法_C
- 2022-04-30 C語言實現考勤管理系統_C 語言
- 2022-07-16 SpringMVC @Controller和@RequestMapping注解
- 2022-08-17 C++詳解如何通過模板實現元素的反序_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支