AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

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

jia28資訊網(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)存分配和釋放的開(kāi)銷,提高程序的運(yùn)行效率。jia28資訊網(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)存池的分配和回收。jia28資訊網(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_列表中,表示它們是空閑的,可以被分配。jia28資訊網(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)存塊的地址。jia28資訊網(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)存池。jia28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

我們還提供了兩個(gè)函數(shù)getFreeChunksCount和getUsedChunksCount來(lái)查詢內(nèi)存池的狀態(tài)。這兩個(gè)函數(shù)分別返回空閑和已使用的內(nèi)存塊數(shù)量。jia28資訊網(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)存池。jia28資訊網(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://www.tebozhan.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)簽:
  • 熱門(mén)焦點(diǎn)
  • 一加Ace2 Pro官宣:普及16G內(nèi)存 引領(lǐng)24G

    一加官方今天繼續(xù)為本月發(fā)布的新機(jī)一加Ace2 Pro帶來(lái)預(yù)熱,公布了內(nèi)存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領(lǐng),還有呢?#一加Ace2Pro#,2023 年 8 月,敬請(qǐng)期待。”同時(shí)
  • 企業(yè)采用CRM系統(tǒng)的11個(gè)好處

    客戶關(guān)系管理(CRM)軟件可以為企業(yè)提供很多的好處,從客戶保留到提高生產(chǎn)力。  CRM軟件用于企業(yè)收集客戶互動(dòng),以改善客戶體驗(yàn)和滿意度。  CRM軟件市場(chǎng)規(guī)模如今超過(guò)580
  • 如何通過(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í)行完任
  • 只需五步,使用start.spring.io快速入門(mén)Spring編程

    步驟1打開(kāi)https://start.spring.io/,按照屏幕截圖中的內(nèi)容創(chuàng)建項(xiàng)目,添加 Spring Web 依賴項(xiàng),并單擊“生成”按鈕下載 .zip 文件,為下一步做準(zhǔn)備。請(qǐng)?jiān)谶M(jìn)入步驟2之前進(jìn)行解壓。圖
  • 虛擬鍵盤(pán) API 的妙用

    你是否在遇到過(guò)這樣的問(wèn)題:移動(dòng)設(shè)備上有一個(gè)固定元素,當(dāng)激活虛擬鍵盤(pán)時(shí),該元素被隱藏在了鍵盤(pán)下方?多年來(lái),這一直是 Web 上的默認(rèn)行為,在本文中,我們將探討這個(gè)問(wèn)題、為什么會(huì)發(fā)生
  • 小紅書(shū)1周漲粉49W+,我總結(jié)了小白可以用的N條漲粉筆記

    作者:黃河懂運(yùn)營(yíng)一條性教育視頻,被54萬(wàn)人&ldquo;珍藏&rdquo;是什么體驗(yàn)?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書(shū)就有超過(guò)128萬(wàn)人,為她瘋狂點(diǎn)贊!更瘋狂的是,這
  • 小米MIX Fold 3配置細(xì)節(jié)曝光:搭載領(lǐng)先版驍龍8 Gen2+罕見(jiàn)5倍長(zhǎng)焦

    這段時(shí)間以來(lái),包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 三星顯示已開(kāi)始為AR設(shè)備研發(fā)硅基LED微顯示屏

    7月18日消息,據(jù)外媒報(bào)道,隨著蘋(píng)果首款頭顯產(chǎn)品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產(chǎn)品也就將成為各大公司下一個(gè)重要的競(jìng)爭(zhēng)領(lǐng)域,對(duì)顯示屏這一關(guān)
  • 聯(lián)想的ThinkBook Plus下一版曝光,鍵盤(pán)旁邊塞個(gè)平板

    ThinkBook Plus 是聯(lián)想的一個(gè)特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據(jù)有人爆料,聯(lián)想的下一款 ThinkBook Plus 可能更特殊,它
Top