日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

如何用C++實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池

來(lái)源: 責(zé)編: 時(shí)間:2024-05-07 09:10:52 221觀看
導(dǎo)讀內(nèi)存池(Memory Pool)是計(jì)算機(jī)編程中一種重要的內(nèi)存管理技術(shù),它預(yù)先分配一塊較大的內(nèi)存區(qū)域,并將其劃分為多個(gè)大小相等的內(nèi)存塊。這種技術(shù)旨在減少因頻繁申請(qǐng)和釋放小塊內(nèi)存而引發(fā)的性能開銷。下面,我們將結(jié)合代碼,一步步講

內(nèi)存池(Memory Pool)是計(jì)算機(jī)編程中一種重要的內(nèi)存管理技術(shù),它預(yù)先分配一塊較大的內(nèi)存區(qū)域,并將其劃分為多個(gè)大小相等的內(nèi)存塊。這種技術(shù)旨在減少因頻繁申請(qǐng)和釋放小塊內(nèi)存而引發(fā)的性能開銷。下面,我們將結(jié)合代碼,一步步講解如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的內(nèi)存池,并分析其工作原理。LHm28資訊網(wǎng)——每日最新資訊28at.com

LHm28資訊網(wǎng)——每日最新資訊28at.com

一、內(nèi)存池的基本概念

內(nèi)存池是一種用于動(dòng)態(tài)內(nèi)存分配的技術(shù),其核心思想是空間換時(shí)間。通過(guò)預(yù)先分配一大塊內(nèi)存,并將其劃分為多個(gè)小塊,內(nèi)存池能夠快速地為程序提供所需的內(nèi)存,而無(wú)需每次都向操作系統(tǒng)申請(qǐng)。這樣可以大大減少內(nèi)存分配和釋放的開銷,提高程序的運(yùn)行效率。LHm28資訊網(wǎng)——每日最新資訊28at.com

二、內(nèi)存池的實(shí)現(xiàn)步驟

1. 定義內(nèi)存池類

首先,我們定義一個(gè)名為AdvancedMemoryPool的模板類,它接受一個(gè)類型參數(shù)T和一個(gè)默認(rèn)大小為100的整數(shù)參數(shù)PoolSize。這個(gè)類將用于管理內(nèi)存池的分配和回收。LHm28資訊網(wǎng)——每日最新資訊28at.com

template <typename T, size_t PoolSize = 100>class AdvancedMemoryPool {    // ...};

2. 初始化內(nèi)存池

在類的構(gòu)造函數(shù)中,我們調(diào)用expandPool函數(shù)來(lái)初始化內(nèi)存池。這個(gè)函數(shù)將分配一塊大小為PoolSize * sizeof(T)的內(nèi)存,并將其劃分為PoolSize個(gè)大小為sizeof(T)的內(nèi)存塊。這些內(nèi)存塊的地址被添加到freeChunks_列表中,表示它們是空閑的,可以被分配。LHm28資訊網(wǎng)——每日最新資訊28at.com

AdvancedMemoryPool() {    expandPool();}private:void expandPool() {    char* newBlock = new char[sizeof(T) * PoolSize];    for (size_t i = 0; i < PoolSize; ++i) {        freeChunks_.push_back(reinterpret_cast<T*>(newBlock + i * sizeof(T)));    }    pool_.push_back(newBlock);}

3. 分配內(nèi)存塊

alloc函數(shù)用于從內(nèi)存池中分配一個(gè)空閑的內(nèi)存塊。它首先檢查freeChunks_列表是否為空。如果為空,則調(diào)用expandPool函數(shù)來(lái)擴(kuò)展內(nèi)存池。然后,它從freeChunks_列表中取出一個(gè)空閑的內(nèi)存塊,并將其從列表中移除。最后,返回這個(gè)內(nèi)存塊的地址。LHm28資訊網(wǎng)——每日最新資訊28at.com

T* alloc() {    std::lock_guard<std::mutex> lock(mutex_); // 確保線程安全    if (freeChunks_.empty()) {        expandPool();    }    T* ptr = freeChunks_.front();    freeChunks_.pop_front();    return ptr;}

這里使用了std::lock_guard來(lái)確保在多線程環(huán)境下的線程安全。當(dāng)多個(gè)線程同時(shí)嘗試分配內(nèi)存時(shí),std::mutex會(huì)確保同一時(shí)間只有一個(gè)線程能夠訪問(wèn)內(nèi)存池。LHm28資訊網(wǎng)——每日最新資訊28at.com

4. 回收內(nèi)存塊

dealloc函數(shù)用于回收一個(gè)之前分配的內(nèi)存塊。它接受一個(gè)指向要回收的內(nèi)存塊的指針,并將這個(gè)指針添加到freeChunks_列表中,表示這個(gè)內(nèi)存塊現(xiàn)在是空閑的,可以被再次分配。LHm28資訊網(wǎng)——每日最新資訊28at.com

void dealloc(T* ptr) {    assert(ptr != nullptr); // 確保傳入的指針不為空    std::lock_guard<std::mutex> lock(mutex_); // 確保線程安全    freeChunks_.push_back(ptr);}

同樣,這里也使用了std::lock_guard來(lái)確保線程安全。LHm28資訊網(wǎng)——每日最新資訊28at.com

5. 查詢內(nèi)存池狀態(tài)

我們還提供了兩個(gè)函數(shù)getFreeChunksCount和getUsedChunksCount來(lái)查詢內(nèi)存池的狀態(tài)。這兩個(gè)函數(shù)分別返回空閑和已使用的內(nèi)存塊數(shù)量。LHm28資訊網(wǎng)——每日最新資訊28at.com

size_t getFreeChunksCount() const {    std::lock_guard<std::mutex> lock(mutex_); // 確保線程安全    return freeChunks_.size();}size_t getUsedChunksCount() const {    return PoolSize - getFreeChunksCount();}

三、使用內(nèi)存池

在主函數(shù)中,我們創(chuàng)建了一個(gè)AdvancedMemoryPool對(duì)象,并使用它來(lái)分配和回收內(nèi)存塊。通過(guò)調(diào)用alloc函數(shù),我們可以從內(nèi)存池中獲取一個(gè)空閑的內(nèi)存塊,并使用它來(lái)存儲(chǔ)數(shù)據(jù)。當(dāng)我們不再需要這個(gè)內(nèi)存塊時(shí),可以調(diào)用dealloc函數(shù)將其回收回內(nèi)存池。LHm28資訊網(wǎng)——每日最新資訊28at.com

四、完整代碼

#include <iostream>  #include <list>  #include <mutex>  #include <cassert>  #include <cstdlib>    template <typename T, size_t PoolSize = 100>  class AdvancedMemoryPool {  public:      AdvancedMemoryPool() {          expandPool();      }        ~AdvancedMemoryPool() {          std::lock_guard<std::mutex> lock(mutex_);          for (auto& chunk : pool_) {              delete[] reinterpret_cast<char*>(chunk);          }      }        T* alloc() {          std::lock_guard<std::mutex> lock(mutex_);          if (freeChunks_.empty()) {              expandPool();          }            T* ptr = freeChunks_.front();          freeChunks_.pop_front();          return ptr;      }        void dealloc(T* ptr) {          assert(ptr != nullptr);          std::lock_guard<std::mutex> lock(mutex_);          freeChunks_.push_back(ptr);      }        size_t getFreeChunksCount() const {          std::lock_guard<std::mutex> lock(mutex_);          return freeChunks_.size();      }        size_t getUsedChunksCount() const {          return PoolSize - getFreeChunksCount();      }    private:      void expandPool() {          char* newBlock = new char[sizeof(T) * PoolSize];          for (size_t i = 0; i < PoolSize; ++i) {              freeChunks_.push_back(reinterpret_cast<T*>(newBlock + i * sizeof(T)));          }          pool_.push_back(newBlock);      }        mutable std::mutex mutex_;      std::list<T*> freeChunks_;      std::list<char*> pool_;  };    // 使用示例  struct ComplexObject {      int data[100];      // 假設(shè)這是一個(gè)復(fù)雜的對(duì)象,需要?jiǎng)討B(tài)分配  };    int main() {      AdvancedMemoryPool<ComplexObject> pool;        ComplexObject* obj1 = pool.alloc();      ComplexObject* obj2 = pool.alloc();        std::cout << "Free chunks: " << pool.getFreeChunksCount() << std::endl;      std::cout << "Used chunks: " << pool.getUsedChunksCount() << std::endl;        pool.dealloc(obj1);      pool.dealloc(obj2);        std::cout << "Free chunks after deallocation: " << pool.getFreeChunksCount() << std::endl;      std::cout << "Used chunks after deallocation: " << pool.getUsedChunksCount() << std::endl;        return 0;  }

本文鏈接:http://m.www897cc.com/showinfo-26-86997-0.html如何用C++實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 微服務(wù)架構(gòu)中的挑戰(zhàn)及應(yīng)對(duì)方式:Outbox 模式

下一篇: React 合成事件和 JavaScript 事件有什么區(qū)別?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • K8S | Service服務(wù)發(fā)現(xiàn)

    一、背景在微服務(wù)架構(gòu)中,這里以開發(fā)環(huán)境「Dev」為基礎(chǔ)來(lái)描述,在K8S集群中通常會(huì)開放:路由網(wǎng)關(guān)、注冊(cè)中心、配置中心等相關(guān)服務(wù),可以被集群外部訪問(wèn);圖片對(duì)于測(cè)試「Tes」環(huán)境或者
  • 如何通過(guò)Python線程池實(shí)現(xiàn)異步編程?

    線程池的概念和基本原理線程池是一種并發(fā)處理機(jī)制,它可以在程序啟動(dòng)時(shí)創(chuàng)建一組線程,并將它們置于等待任務(wù)的狀態(tài)。當(dāng)任務(wù)到達(dá)時(shí),線程池中的某個(gè)線程會(huì)被喚醒并執(zhí)行任務(wù),執(zhí)行完任
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過(guò)這樣的問(wèn)題:移動(dòng)設(shè)備上有一個(gè)固定元素,當(dāng)激活虛擬鍵盤時(shí),該元素被隱藏在了鍵盤下方?多年來(lái),這一直是 Web 上的默認(rèn)行為,在本文中,我們將探討這個(gè)問(wèn)題、為什么會(huì)發(fā)生
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會(huì)涉及各種各樣的安全任務(wù),包括但不限于:開發(fā)某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 2023年,我眼中的字節(jié)跳動(dòng)

    此時(shí)此刻(2023年7月),字節(jié)跳動(dòng)從未上市,也從未公布過(guò)任何官方的上市計(jì)劃;但是這并不妨礙它成為中國(guó)最受關(guān)注的互聯(lián)網(wǎng)公司之一。從2016-17年的抖音強(qiáng)勢(shì)崛起,到2018年的&ldquo;頭騰
  • Temu起訴SHEIN,跨境電商戰(zhàn)事升級(jí)

    來(lái)源 | 伯虎財(cái)經(jīng)(bohuFN)作者 | 陳平安日前據(jù)外媒報(bào)道,拼多多旗下跨境電商平臺(tái)Temu正對(duì)競(jìng)爭(zhēng)對(duì)手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場(chǎng)支配力量強(qiáng)迫服裝廠商與之簽訂獨(dú)家
  • 2天漲粉255萬(wàn),又一賽道在抖音爆火

    來(lái)源:運(yùn)營(yíng)研究社作者 | 張知白編輯 | 楊佩汶設(shè)計(jì) | 晏談夢(mèng)潔這個(gè)暑期,旅游賽道徹底火了:有的「地方」火了&mdash;&mdash;貴州村超旅游收入 1 個(gè)月超過(guò) 12 億;有的「博主」火了&m
  • iQOO Neo8系列今日官宣:首發(fā)天璣9200+ 全球安卓最強(qiáng)芯!

    在昨日舉行的的聯(lián)發(fā)科新一代旗艦芯片天璣9200+的發(fā)布會(huì)上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發(fā)搭載這款當(dāng)前性能最強(qiáng)大的移動(dòng)平臺(tái)
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日?qǐng)?bào) 記者 王春   □ 本報(bào)通訊員 胡佳麗  2020年初,還在上大學(xué)的小東加入了一個(gè)大學(xué)生兼職QQ群。群主&ldquo;七王&rdquo;在群里介紹一些刷單賺
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
男人插女人欧美| 亚洲综合精品四区| 依依成人综合视频| 在线免费日韩片| 亚洲日本黄色| 亚洲欧美美女| 久久综合色播五月| 欧美麻豆久久久久久中文| 欧美激情精品久久久久久久变态| 欧美视频在线观看| 国产欧美一区二区三区在线老狼| 精品51国产黑色丝袜高跟鞋| 亚洲精品欧美日韩专区| 亚洲欧美成人综合| 久久亚洲影院| 欧美视频在线不卡| 国产综合色在线视频区| 日韩午夜av在线| 欧美一区二区三区四区高清 | 欧美日韩一区三区四区| 国产区亚洲区欧美区| 亚洲国产精品久久久久秋霞影院| 亚洲小说欧美另类婷婷| 老色鬼久久亚洲一区二区| 国产精品va在线播放我和闺蜜| 国产午夜精品福利| 亚洲伦伦在线| 久久久久久久91| 国产精品v欧美精品∨日韩| 136国产福利精品导航| 亚洲在线观看免费视频| 欧美电影免费观看| 国产一区二区欧美日韩| 一区二区不卡在线视频 午夜欧美不卡在 | 午夜欧美精品| 欧美精品亚洲二区| 韩日视频一区| 亚洲欧美韩国| 欧美久久视频| 精品成人a区在线观看| 亚洲线精品一区二区三区八戒| 美玉足脚交一区二区三区图片| 国产乱人伦精品一区二区| 日韩午夜在线播放| 久久中文在线| 国产色产综合色产在线视频 | 免费人成网站在线观看欧美高清 | 在线日韩电影| 欧美在现视频| 国产精品久久国产愉拍 | 一区二区在线视频播放| 亚洲欧美日韩综合| 欧美日韩久久不卡| 亚洲国产精品日韩| 久久久99国产精品免费| 国产精品视频免费在线观看| 日韩亚洲欧美一区二区三区| 免费成人在线视频网站| 韩国精品在线观看| 欧美在线亚洲| 国产欧美一区二区三区在线老狼| 亚洲午夜精品国产| 欧美日韩精品免费观看视频| 亚洲国产网站| 狂野欧美一区| 在线观看视频一区二区欧美日韩| 久久精品国产99精品国产亚洲性色| 国产精品卡一卡二| 亚洲特级片在线| 欧美少妇一区| 一区二区三区免费观看| 欧美日韩国产影院| 99国内精品久久| 欧美日本国产精品| 亚洲精品一区二区三区不| 免费观看国产成人| 亚洲第一在线| 欧美成人69av| 亚洲欧洲日本一区二区三区| 欧美成人综合| 亚洲精品在线二区| 欧美黄污视频| 亚洲美女区一区| 欧美日韩美女在线| 亚洲午夜性刺激影院| 国产酒店精品激情| 欧美综合国产精品久久丁香| 国内成人精品2018免费看| 久久亚洲高清| 亚洲国产成人久久综合| 欧美二区在线观看| 亚洲精品免费电影| 欧美日在线观看| 中文亚洲字幕| 国产精品羞羞答答| 欧美综合77777色婷婷| 很黄很黄激情成人| 蜜臀久久99精品久久久久久9 | 亚洲国产欧美在线人成| 欧美国产高清| 99国内精品久久| 国产精品久久久久久久久久尿| 亚洲欧美日本日韩| 国产一区二区三区高清| 久久亚洲图片| 日韩视频一区二区在线观看| 欧美色欧美亚洲另类七区| 亚洲欧美另类在线观看| 国产一区二区久久久| 另类av一区二区| 99国内精品久久| 国产精品网站在线| 久久亚洲免费| 亚洲精品综合| 国产精品老女人精品视频| 久久精品国产久精国产一老狼| 亚洲国产清纯| 国产精品久久久久久久久久尿 | 欧美视频精品在线| 午夜天堂精品久久久久| 一区在线影院| 欧美日韩国产免费| 性欧美videos另类喷潮| 在线精品国产欧美| 欧美日韩精品在线| 欧美亚洲免费电影| 亚洲黑丝一区二区| 国产精品久久久久久久久久尿 | 国内精品久久久久伊人av| 欧美国产免费| 亚洲欧美偷拍卡通变态| 亚洲成人在线视频播放| 欧美日韩亚洲系列| 久久精品国产96久久久香蕉| 亚洲麻豆av| 国产亚洲一区在线播放| 欧美精品七区| 欧美在线视频观看| 亚洲精品中文字幕在线| 国产日韩欧美在线视频观看| 欧美成人综合| 欧美在线免费视频| aa亚洲婷婷| 欲色影视综合吧| 国产精品国产自产拍高清av王其| 久热成人在线视频| 亚洲专区免费| 日韩午夜精品| 精品99一区二区三区| 国产精品久久久久久久久久尿| 免费h精品视频在线播放| 亚洲欧美国产精品桃花| 最新日韩在线视频| 国产丝袜美腿一区二区三区| 欧美欧美天天天天操| 久久国产精品黑丝| 在线亚洲精品福利网址导航| 在线成人亚洲| 国产日韩欧美高清免费| 欧美日精品一区视频| 老司机精品视频一区二区三区| 午夜精品久久| 在线亚洲欧美| 亚洲精品久久久久| 在线观看中文字幕不卡| 国产亚洲人成网站在线观看| 国产精品va在线播放| 欧美精品在线播放| 噜噜噜噜噜久久久久久91| 欧美在线视频一区二区三区| 亚洲一级在线观看| 亚洲蜜桃精久久久久久久| 影音先锋另类| 国产伦精品一区二区三区四区免费| 欧美母乳在线| 欧美xx视频| 另类专区欧美制服同性| 久久久亚洲国产天美传媒修理工| 午夜在线一区二区| 亚洲综合精品自拍| 亚洲视频导航| 一片黄亚洲嫩模| 99精品欧美| 日韩视频三区| 亚洲精品日韩在线观看| 最新国产精品拍自在线播放| **性色生活片久久毛片| 精品不卡在线| 伊人久久婷婷| 1024成人网色www| 在线观看一区视频| 亚洲高清毛片| 在线看日韩av| 精品二区视频| 在线观看中文字幕亚洲| 亚洲成在人线av| 亚洲高清视频的网址| 亚洲国产精品va在线观看黑人| 亚洲第一黄色| 亚洲电影第1页| 亚洲国产欧美一区二区三区丁香婷| 亚洲国产精品专区久久| 最新日韩欧美| 日韩一区二区精品视频|