C++ 手寫一個內存池

內存池是一種內存管理技術,它預先分配一大塊內存,之后將其按需分割成多個小塊供程序使用。下面將詳細闡述它的好處以及適用場景。

內存池的好處

  1. 減少內存碎片:在動態內存分配時,頻繁地分配和釋放不同大小的內存塊,會使得內存空間出現許多小塊的、不連續的空閑內存,也就是內存碎片。這可能導致后續即使有足夠的總空閑內存,也無法分配出大塊連續內存。內存池預先分配連續的大塊內存,然后按需分配小塊,能夠有效減少內存碎片的產生。
  2. 提升性能:每次使用系統調用(如?mallocfree)進行內存分配和釋放時,會涉及到內核態和用戶態的切換,開銷較大。內存池通過預先分配內存,在需要時直接從池中獲取,避免了頻繁的系統調用,從而顯著提高了內存分配和釋放的速度。
  3. 可預測性:使用內存池可以更好地控制內存的使用,程序能夠預先知道可用內存的大小和分配情況,有助于進行內存管理和優化,避免因內存耗盡導致的程序崩潰。

適用場景

  1. 頻繁進行內存分配和釋放的場景:在一些需要頻繁創建和銷毀對象的應用程序中,例如游戲開發中頻繁創建和銷毀游戲角色、粒子效果等,使用內存池可以避免頻繁的系統調用,提高程序的性能。
  2. 對內存碎片敏感的場景:某些實時系統或嵌入式系統,對內存的連續性要求較高。內存碎片可能導致無法分配大塊連續內存,影響系統的正常運行。使用內存池可以有效減少內存碎片,保證系統的穩定性。
  3. 對性能要求較高的場景:在高并發的服務器程序中,如 Web 服務器、數據庫服務器等,每秒可能會處理大量的請求,每個請求可能都需要分配和釋放內存。使用內存池可以顯著提高內存分配和釋放的速度,從而提升服務器的整體性能。

?一:簡單的內存池來管理固定數量的內存塊

#include <iostream>
#include <vector>// 內存池類
class MemoryPool {
private:// 塊大小size_t blockSize;// 塊數量size_t blockCount;// 空閑塊列表std::vector<void*> freeList;public:MemoryPool(size_t blockSize, size_t blockCount) : blockSize(blockSize), blockCount(blockCount) {for (size_t i = 0; i < blockCount; ++i) {void* block = ::operator new(blockSize);freeList.push_back(block);}}~MemoryPool() {for (void* block : freeList) {::operator delete(block);}}// 從內存池分配內存void* allocate() {if (freeList.empty()) {return nullptr;}void* block = freeList.back();freeList.pop_back();return block;}// 將內存釋放回內存池void deallocate(void* block) {freeList.push_back(block);}
};// 測試函數
void testMemoryPool() {MemoryPool pool(1024, 10);std::vector<void*> allocatedBlocks;// 分配內存for (size_t i = 0; i < 5; ++i) {void* block = pool.allocate();if (block) {allocatedBlocks.push_back(block);std::cout << "Allocated block at address: " << block << std::endl;} else {std::cout << "No available blocks in the pool." << std::endl;}}// 釋放內存for (void* block : allocatedBlocks) {pool.deallocate(block);std::cout << "Deallocated block at address: " << block << std::endl;}
}int main() {testMemoryPool();return 0;
}    

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80154.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 3341.到達最后一個房間的最少時間 I:Dijkstra算法(類似深搜)-簡短清晰的話描述

【LetMeFly】3341.到達最后一個房間的最少時間 I&#xff1a;Dijkstra算法&#xff08;類似深搜&#xff09;-簡短清晰的話描述 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/find-minimum-time-to-reach-last-room-i/ 有一個地窖&#xff0c;地窖中有 n x m 個房間…

學習Linux的第四天

今天我們來學習Linux的網絡配置&#xff0c;以及鏈表的知識開個小頭 三種網絡配置模式 橋接模式&#xff08;用的最多&#xff09; 2.Nat模式 3. 僅主機模式&#xff08;Nat模式的功能外&#xff0c;只能在局域網通信&#xff0c;不能訪問外網&#xff09; 橋接模式&#xf…

【 window.addEventListener(‘message‘, handleMessage)無效的問題】

在react native加載中可能出現 window.addEventListener(‘message’, handleMessage)無效&#xff0c;無法監聽到在react-native-webview中通過postMessage發送的消息&#xff0c;可以通過下面的方法來處理 window.addEventListener(message, handleMessage);document.addEven…

css識別\n換行

在CSS中&#xff0c;\n 通常不會被識別為換行符。如果你希望在CSS中實現換行效果&#xff0c;可以使用以下幾種方法&#xff1a; 使用 white-space 屬性&#xff1a; 設置 white-space: pre 或 white-space: pre-wrap&#xff0c;這樣文本中的換行符 \n 會被保留并顯示為換行。…

電容知識小結

1.同樣是電容&#xff0c;1uf的陶瓷電容和1uf的鋁電解電容是不一樣的&#xff1b; 2.實際的電容等效為ESR C ESL;ESR等效電阻和ESL等效電感&#xff1b; 3.鋁電解電容&#xff0c;瓷片電容和鉭電容。 4.電容是容納和釋放電荷的電子器件&#xff1b; 5.電容的工作&#xff1a;…

[逆向工程]什么是HOOK(鉤子)技術(二十一)

[逆向工程]什么是HOOK&#xff08;鉤子&#xff09;技術&#xff08;二十一&#xff09; HOOK&#xff08;鉤子&#xff09;是一種系統級或應用級的消息攔截與處理機制&#xff0c;廣泛用于監控、修改或增強程序行為。其核心思想是在特定事件&#xff08;如鍵盤輸入、函數調用…

java后端知識點復習

# 復習匯總 ### &#x1f9d1;?&#x1f4bb; User java關于高并發下的銀行轉賬問題&#xff0c;根據具體的例子來講解清楚 --- ### &#x1f916; Assistant --- ### &#x1f9d1;?&#x1f4bb; User java關于高并發下的銀行轉賬問題&#xff0c;根據具體的例子來講…

PostgreSQL安裝與升級cron插件

cron插件是PostgreSQL數據庫一個好用的定時任務管理的插件。 注&#xff1a;以下命令均在debian linux bookworm版本系統上驗證通過。 apt安裝cron插件 #獲取軟件包驗證的公鑰 wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - #…

66、微服務保姆教程(九)微服務的高可用性

微服務的高可用性與擴展 服務的高可用性 集群搭建與負載均衡。服務的故障容錯與自愈。分布式事務與一致性 分布式事務的挑戰與解決方案。使用 RocketMQ 實現分布式事務。微服務的監控與可觀測性 metrics 和日志的收集與分析。sentinel 的監控功能。容器化與云原生 將微服務部署…

6. HTML 錨點鏈接與頁面導航

在開發長頁面或文檔類網站時,錨點鏈接(Anchor Links)是一個非常實用的功能。通過學習 HTML 錨點技術,將會掌握如何在同一頁面內實現快速跳轉,以及如何優化長頁面的導航體驗。以下是基于給定素材的學習總結和實踐心得 一、什么是錨點鏈接? 錨點鏈接(也稱為頁面內鏈接)允…

【iOS】源碼閱讀(三)——內存對齊原理

文章目錄 前言獲取內存大小的三種常用方式sizeofclass_getInstanceSizemalloc_size 總結 前言 之前學習alloc相關源碼&#xff0c;涉及到內存對齊的相關內容&#xff0c;今天筆者詳細學習了一下相關內容并寫了此篇博客。 獲取內存大小的三種常用方式 獲取內存大小的方式有很多…

新手學編程前端好還是后端

在當今數字化的時代&#xff0c;編程成為了一項備受追捧的技能。對于那些剛剛踏入編程世界的新手來說&#xff0c;常常會面臨一個重要的抉擇&#xff1a;是選擇前端開發&#xff0c;還是后端開發&#xff1f;這就像是站在一個分岔路口&#xff0c;每一條路都充滿了未知和機遇。…

【面試 · 一】vue大集合

目錄 vue2 基礎屬性 組件通信 全局狀態管理 vueX 路由 路由守衛 vue3 基礎屬性 組件通信 全局狀態管理 Pinia 路由 路由守衛 vue2、vue3生命周期 setup vue2 基礎屬性 data&#xff1a;用于定義組件的初始數據&#xff0c;必須是一個函數&#xff0c;返回一個對…

nginx之proxy_redirect應用

一、功能說明 proxy_redirect 是 Nginx 反向代理中用于修改后端返回的響應頭中 Location 和 Refresh 字段的核心指令&#xff0c;主要解決以下問題&#xff1a;協議/地址透傳錯誤&#xff1a;當后端返回的 Location 包含內部 IP、HTTP 協議或非標準端口時&#xff0c;需修正為…

[Qt] mvd使用的注意事項

在使用mvd時&#xff0c;我們可能會有這種需求&#xff0c;比如有一項的數據是文件類型&#xff0c;然后我們要彈出一個文件對話框&#xff0c;選擇一個文件路徑然后把文件路徑展示出來。 我們可能寫出如下代碼 #include "MyStyledItemDeletegate.h" #include <Q…

LeetCode 220 存在重復元素 III 題解

LeetCode 220 存在重復元素 III 題解 題目描述 給定一個整數數組 nums 和兩個整數 k 和 t&#xff0c;請判斷數組中是否存在兩個不同的索引 i 和 j&#xff0c;使得&#xff1a; abs(nums[i] - nums[j]) < tabs(i - j) < k 方法思路&#xff1a;桶排序 滑動窗口 核…

路由器詳細講解

目錄 一、路由器的定義和基本功能 二、路由器的分類 三、路由器的工作原理 四、路由器的配置 五、路由器的選購要點 路由器是一種網絡設備&#xff0c;它在計算機網絡中扮演著至關重要的角色&#xff0c;主要用于連接不同的網絡&#xff0c;并根據數據包的目的地址選擇合適…

Spring MVC @CookieValue 注解怎么用?

CookieValue 注解的作用 CookieValue 注解用于將 HTTP 請求中特定 Cookie 的值綁定到 Controller 方法的參數上。 Cookies 是由服務器發送到用戶瀏覽器并保存在本地的一小塊數據。瀏覽器在后續向同一服務器發送請求時&#xff0c;會通過 Cookie 請求頭將這些數據再帶回給服務…

控制mac地址表端口安全

一、端口安全的核心理論 安全MAC地址類型 安全動態MAC&#xff1a;啟用端口安全后動態學習的MAC地址&#xff0c;設備重啟后丟失&#xff0c;需重新學習。 安全靜態MAC&#xff1a;手動配置的MAC地址&#xff0c;永久生效且不會被老化。 Sticky MAC&#xff1a;動態學習后自動…

【wpf】10 C#樹形控件高效實現:遞歸構建與路徑查找優化詳解

在WPF應用程序開發中&#xff0c;樹形控件的實現是常見且具有挑戰性的需求。本文將深入解析一套高效樹形結構的實現方案&#xff0c;包含遞歸構建、路徑查找優化、動態交互等多個關鍵技術點。 一、遞歸構建樹形結構 private TreeItem CreateTreeViewItem(TreeNode node) {var…