高并發內存池(12)-ThreadCache回收內存

高并發內存池(12)-ThreadCache回收內存

代碼如下:

// 釋放對象時,鏈表過長時,回收內存回到中心緩存
void ThreadCache::ListTooLong(FreeList& list, size_t size)
{void* start = nullptr;void* end = nullptr;list.PopRange(start, end, list.MaxSize());CentralCache::GetInstance()->ReleaseListToSpans(start, size);
}
//還給Central的自由鏈表
void* PopRange(void*&start,void*&end,size_t n)
{assert(n <= _size);start = _freeList;end = start;for (size_t i = 0; i < n - 1; ++i){end = NextObj(end);}_freeList = NextObj(end);NextObj(end) = nullptr;_size -= n;
}

PopRange函數中使用引用參數(void*& start, void*& end)是極其重要的設計選擇,有以下幾個關鍵原因:

1. 需要修改調用方的變量

void* start_ptr = nullptr;
void* end_ptr = nullptr;
freeList.PopRange(start_ptr, end_ptr, 5);  // 需要修改start_ptr和end_ptr的值

如果沒有引用

  • 函數內部修改的只是參數的副本
  • 調用方的變量不會被實際修改
  • 無法返回提取的內存塊鏈表信息

2. 需要返回兩個值

函數需要同時返回:

  • 批量鏈表的頭指針start
  • 批量鏈表的尾指針end

C++函數只能直接返回一個值,所以必須通過參數返回另一個值。

替代方案對比:

方案1:使用引用參數(當前實現) ?

void PopRange(void*& start, void*& end, size_t n);
// 清晰,高效,常用

方案2:返回結構體 ?

struct RangeResult {void* start;void* end;
};
RangeResult PopRange(size_t n);
// 需要定義額外結構體,不夠直觀

方案3:使用指針參數 ?

void PopRange(void** start, void** end, size_t n);
// 語法復雜,容易出錯

3. 性能零開銷

引用在底層通常通過指針實現,但:

  • 語法更簡潔:像操作普通變量一樣
  • 類型安全:編譯器會檢查類型匹配
  • 無性能損失:與指針方案性能相同

4. 代碼可讀性

對比兩種寫法:

使用引用(清晰)

void* start, *end;
freeList.PopRange(start, end, 5);
// 現在start和end包含了提取的鏈表

使用指針參數(復雜)

void* start, *end;
freeList.PopRange(&start, &end, 5);
// 需要取地址,容易忘記&

5. 在內存池中的具體應用

// CentralCache向ThreadCache提供內存
void CentralCache::FetchRangeObj(void*& start, void*& end, size_t n)
{// 需要修改start和end來返回內存塊鏈表_freeList.PopRange(start, end, n);// 現在start和end包含了提取的內存塊
}

如果不使用引用會怎樣?

// 錯誤版本:不使用引用
void PopRange(void* start, void* end, size_t n)
{start = _freeList;  // 這只是修改局部副本!// 調用方的變量不會被修改
}// 調用代碼
void* my_start, *my_end;
freeList.PopRange(my_start, my_end, 5);  // my_start和my_end仍然是nullptr!

總結

使用引用參數void*& start, void*& end是因為:

  1. 需要修改調用方的變量
  2. 需要返回兩個值(鏈表頭和尾)
  3. 語法簡潔且類型安全
  4. 性能零開銷
  5. 代碼可讀性好

這是C++中常用的"輸出參數"模式,特別適合需要返回多個值的場景。在內存池這種高性能組件中,這種設計確保了接口的效率和簡潔性。

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

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

相關文章

讀大語言模型09超級智能

1. 超級智能1.1. 如果人工智能超越人類智能&#xff0c;可能會成為人類存在的一個重大威脅1.1.1. 對超級人工智能潛在危險最為擔憂的群體中&#xff0c;恰恰包括那些否認大語言模型具備真正智能的人1.2. 計算機科學已經成為所有科學領域中不可或缺的重要組成部1.3. GPT具備編寫…

阿里云拉取dockers鏡像

假如你已經在云服務器上安裝了docker需要配置下docker鏡像加速代理就行了找到自己的加速網址&#xff1a;然后在云服務器上&#xff0c;修改docker 配置文件&#xff0c;vi /etc/docker/daemon.json沒有這個文件的話&#xff0c;需要創建一個。{"default-address-pools&qu…

python自學筆記14 NumPy 線性代數

在Numpy庫中有專門的linalg 模塊用來做線性代數相關的運算。 本文中線性代數的一般概念不會解釋 拆解矩陣 鳶尾花數據矩陣結構如下&#xff08;150 4&#xff09;&#xff1a;取其中的行向量和列向量&#xff1a; # 導入包 import numpy as np from sklearn.datasets import l…

ubuntu20搭建MQTT

sudo apt update sudo apt install mosquitto mosquitto-clients sudo mosquitto_passwd -c /etc/mosquitto/passwd myuser sudo nano /etc/mosquitto/mosquitto.conf# 允許匿名用戶連接&#xff08;默認為 true&#xff0c;我們先關閉它&#xff09; allow_anonymous false# 指…

云服務器的主要用途都有哪些?

企業可以利用云服務器構建官方網站&#xff0c;企業官網需要穩定的運行環境來展示產品、服務、公司動態等信息&#xff0c;云服務器提供的高可用性和可擴展性&#xff0c;能保障大量用戶同時訪問時網站的穩定運行。移動應用的后端服務可以部署在云服務器上&#xff0c;如社交類…

IntelliJ IDEA Debug 模式功能指南

文章目錄前言&#x1f4a1; 1. 斷點類型與設置&#x1f680; 2. 啟動 Debug 模式?? 3. 調試控制按鈕詳解&#x1f440; 4. 查看與監控變量&#x1f9f0; 5. 高級調試技巧&#x1f48e; 總結前言 作為一名 Java 開發者&#xff0c;熟練掌握調試技巧是提高開發效率的關鍵。Int…

在pycharmIDE中如何快速掌握一個新模塊的使用方法

一、文檔使用懸停文檔&#xff1a;鼠標懸停在模塊/函數上顯示文檔摘要 (?最常用)快速文檔&#xff1a;選中標識符按 CtrlQ (Windows/Linux) 或 F1 (Mac)跳轉定義&#xff1a;Ctrl左鍵單擊 直接跳轉到源碼定義處 (?最權威)參數提示&#xff1a;輸入函數名時自動顯示參數列表&a…

win11自定義停止更新方法

一、打開運行窗口&#xff08;winr&#xff09;輸入regedit打開注冊表編輯器。按照如下路徑尋找。計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings二、在Settings頁面下右擊——>新建——>DWORD(32位)值(D)&#xff0c;并重命名為粉色框中的名字…

Unity委托、匿名方法與事件深度解析:從理論到實戰

Unity委托、匿名方法與事件深度解析&#xff1a;從理論到實戰 摘要&#xff1a;本文深入剖析Unity中委托、匿名方法與事件的核心機制&#xff0c;結合理論框架與實戰案例&#xff0c;幫助開發者掌握高效的事件驅動編程技巧。全文包含12個代碼片段及6個核心原理圖示框架&#x…

大腦的藏寶圖——神經科學如何為自然語言處理(NLP)的深度語義理解繪制新航線

摘要&#xff1a; 截至2025年&#xff0c;大型語言模型&#xff08;LLM&#xff09;已展現出驚人的能力&#xff0c;但其內在的“黑箱”特性和對深層語義理解的局限性也日益凸顯。本報告旨在深入探討一個充滿潛力的前沿交叉領域&#xff1a;借鑒地球上最古老、最精密的語言處理…

記錄使用ruoyi-flowable開發部署中出現的問題以及解決方法(二)

1.vform的使用與傳值 使用動態表單&#xff0c;把當前的用戶名傳值進動態表單&#xff0c;另外動態表單的上傳組件成功后傳值會父組件。 在父組件的加載函數中增加&#xff1a; mounted(){this.$refs.vFormRef.addEC("getuploadfile",this);},該方法為給表單加載外…

Apifox 8 月更新|新增測試用例、支持自定義請求示例代碼、提升導入/導出 OpenAPI/Swagger 數據的兼容性

Apifox 作為全能 API 工具&#xff0c;正以迅猛之勢革新開發者的工作方式&#xff01;想象一下&#xff0c;您正為測試用例編寫頭疼&#xff0c;或因 OpenAPI 文件導入失敗而延誤項目&#xff0c;而 Apifox 8 月更新卻帶來“救命稻草”&#xff1a;新增測試用例功能、自定義請求…

多機多卡微調流程

多機多卡&#xff08;Distributed Training&#xff09;微調大模型是一項復雜但非常高效的任務。它允許你利用多臺機器的計算資源來訓練一個模型&#xff0c;從而顯著縮短訓練時間。 多機多卡微調核心流程 整個流程可以概括為以下幾個核心步驟&#xff1a; 環境準備與硬件配置 …

Redis(23) RDB和AOF有什么區別?

Redis 的 RDB&#xff08;Redis Database&#xff09;和 AOF&#xff08;Append-Only File&#xff09;是兩種主要的持久化機制。每種機制都有其獨特的工作方式、優缺點和適用場景。以下是兩者的詳細比較&#xff0c;并結合代碼示例進行解釋。 RDB&#xff08;Redis Database&a…

在WSL2 Ubuntu中部署FastDFS服務的完整指南

在WSL2 Ubuntu中部署FastDFS服務的完整指南&#x1f4d6; 前言&#x1f6e0;? 環境準備1. 系統要求2. Ubuntu應用&#x1f680; 安裝服務1. 更新系統2. 安裝編譯依賴3. 下載源碼4. 編譯安裝&#x1f527; 配置服務1. 設置配置文件2. 創建數據目錄3. 配置Tracker服務4. 配置Sto…

新手向:網絡編程完全指南

1. 引言&#xff1a;什么是網絡編程&#xff1f;網絡編程&#xff08;Network Programming&#xff09;是指利用計算機網絡實現程序間通信的技術。它構建在計算機網絡協議基礎上&#xff0c;通過編程實現不同設備間的數據交換與資源共享。從底層協議實現到高層應用開發&#xf…

阿里云——云存儲與數據庫服務

云存儲與數據庫服務 數據是數字時代的新石油&#xff0c;而存儲與數據庫服務就是保存和提煉這些石油的“油庫與煉油廠”。阿里云提供了從對象、塊、文件存儲到關系型、NoSQL、數據倉庫的全方位數據服務。本章將幫你構建一套清晰的數據存儲選型框架&#xff0c;并掌握核心服務的…

瀏覽器網頁路徑掃描器(腳本)

使用網頁路徑掃描器可以掃描網頁的路徑&#xff0c;一些工具如ffuf為在命令行上操作&#xff0c;比較不便&#xff0c;而其他資源不好找到 Website path scanner(Script-tampermonkey) 腳本發布在GitHub&#xff0c;本文章也關聯文件資源 GitHub:Website path scanner(Script-…

實戰原型模式案例

作者&#xff1a;小凱 分享、讓自己和他人都能有所收獲&#xff01;&#x1f604; 一、前言 老板你加錢我的代碼能飛 程序員這份工作里有兩種人&#xff1b;一類是熱愛喜歡的、一類是僅當成工作的。而喜歡代碼編程的這部分人會極其主動學習去豐富自己的羽翼&#xff0c;也非常喜…

微信小程序餐飲掃碼點餐小程序堂食外賣桌臺自助下單源碼

功能說明&#xff1a;商家助手APP、接單更方便前端頁面模版隨意挑選&#xff0c;可diy精裝設計線下買單餐桌點餐快速下單會員管理訂單管理優惠券核銷叫號取餐排隊叫號商品管理桌位管理數據統計售后訂單配送設置推廣碼硬件設備一、技術架構&#xff1a;PHPUniApp構建高性價比系統…