高并發內存池(1)-定長內存池

高并發內存池(1)-定長內存池

可以采用兩種方式:

方式1:

template <size_t N>

方式2:

template <class T>

獲取到T對象大小的內存池,更推薦使用方式二,因為可以動態靈活調整類型

需要的成員變量:

_memory:表示一大塊內存,需要確定使用的變量類型

能否使用void*?

*表示的是指針,指針代表的是地址,它的指向需要有意義, *的前面表示的是類型,void * 沒有意義,既不能解引用又不能進行加減

解決方案就是換成char*,因為一個char表示一個字節,也可以用int之類的,但是不會方便,比如要是取3字節啥的

怎么管理需要還回來的鏈表?

用自由鏈表

怎么樣去連接?

不用結構體,用其內存塊當節點,用頭四個或者八個節點存儲下一個位置的地址,這時候需要處理如果只剩最后一個會不會越界的情況,這時候我們需要引入新的成員變量remianBytes來知道剩余內存的大小,

自由鏈表需要進行頭插,注意類型是void*,因為void *在32位下是4字節,64位是八字節,不用寫if else條件判斷語句去判斷

整體的代碼如下:

#pragma once#include <iostream>
#include <vector>
#include <time.h>using std::cout;
using std::endl;#ifdef _WIN32
#include <windows.h>
#else
// ...
#endif// 直接去堆上按頁申請空間
inline static void* SystemAlloc(size_t kpage)
{
#ifdef _WIN32void* ptr = VirtualAlloc(0, kpage << 13, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
#else// linux下brk mmap等
#endifif (ptr == nullptr)throw std::bad_alloc();return ptr;
}//定長內存池:每次獲取到T對象大小的內存池
template <class T>
class ObjectPool
{public://對內存進行分配T* New(){//創建每次需要分配的內存塊T* obj =nullptr;//優先使用自由鏈表里面的if (_freeList){//定義next指針void* next = *((void**)_freeList);obj = (T*)_freeList;_freeList = next;}//如果自由鏈表里面的不夠了,再進行創建else{// 剩余內存不夠一個對象大小時,則重新開大塊空間if (remainBytes < sizeof(T)){//初始化remainBytes的大小remainBytes = 128 * 1024;//空間開辟大小,右移13相當于除以2的十三次方,2的10次方已經是1000多_memory = (char*)SystemAlloc(_remainBytes >> 13);//如果開創空間有異常就拋出異常if (_memory == nullptr){throw std::bad_alloc();}}//此時創建空間obj = (T*)_memory;//判斷T對象的大小,void*在32位下是4字節,64位下是8字節size_t objSize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T);//切下空間_memory += objSize;//剩余空間去扣除相應的大小remainBytes -= objSize;}// 定位new,顯示調用T的構造函數初始化,以防會調用如vector,string之類的new(obj)T();return obj;}//自由鏈表進行管理T* Delete(T*obj){// 顯示調用析構函數清理對象obj->~T();// 頭插,存前4個或者8個字節到下一節點*(void**)obj = _freeList;_freeList = obj;}private:char* _memory = nullptr;// 指向大塊內存的指針size_t remainBytes = 0;// 大塊內存在切分過程中剩余字節數void* _freeList = nullptr;// 還回來過程中鏈接的自由鏈表的頭指針
};

整體的流程:先看freeList有沒有空余的,先進行頭刪,然后再到_memory里面去切,如果沒有多余的,就去找系統申請大塊內存

如何釋放?不需要釋放,不需要擔心內存是否會泄漏,因為只要進程結束,它也能正常釋放

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

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

相關文章

第三階段sql server數據-4:數據庫腳本生成,備份與還原,分離與附加操作的圖文步驟

1_生成數據庫腳本&#xff08;1&#xff09;在數據庫上右鍵選擇任務&#xff08;2&#xff09;選擇生成腳本&#xff08;3&#xff09;選擇下一步&#xff0c;如果下次不想顯示此頁面&#xff0c;可勾選不再顯示此頁&#xff08;4&#xff09;如果導出全部數據&#xff0c;選擇…

【C++闖關筆記】STL:string的學習和使用(萬字精講)

?系列文章目錄 第零篇&#xff1a;從C到C入門&#xff1a;C有而C語言沒有的基礎知識總結-CSDN博客 第一篇&#xff1a;【C闖關筆記】封裝①&#xff1a;類與對象-CSDN博客 第二篇&#xff1a;【C闖關筆記】封裝②&#xff1a;友元與模板-CSDN博客 第三篇&#xff1a;【C闖…

06 - spring security角色和權限設置

spring security角色和權限設置 文檔 00 - spring security框架使用01 - spring security自定義登錄頁面02 - spring security基于配置文件及內存的賬號密碼03 - spring security自定義登出頁面04 - spring security關閉csrf攻擊防御05 - spring security權限控制 角色和權限…

如何實現文檔處理全流程自動化?

在處理文本文檔、電子郵件、視頻音頻、社媒帖子等非結構化數據時&#xff0c;我們經常發現這些數據難以用傳統的數據庫表格進行存儲和管理&#xff0c;因為其沒有明確的結構和標準化的格式&#xff0c;因此&#xff0c;這類數據處理難度較大&#xff0c;當傳統“人眼Excel”模式…

Java Main無法初始化主類的原因與解決方法(VsCode工具)

個人操作 由于上傳git將target目錄也上傳了所以在本地刪除target之后再重新同步更新動作然后直接在vscode工具上run本地項目運行報錯&#xff0c;報錯信息如下 報錯信息分析原因1. 工具配置 用 VS Code 的“Run”運行按鈕時&#xff0c;是否會自動編譯&#xff0c;取決于你的 V…

Azure Kubernetes Service (AKS)

Overview AKS&#xff08;Azure Kubernetes Service&#xff09; 是 Microsoft Azure 提供的一種托管Kubernetes 服務&#xff0c;旨在簡化 Kubernetes 集群的部署、管理和操作。輕松運行和擴展基于容器的應用程序&#xff0c;而無需管理 Kubernetes 本身的基礎設施。 AKS與 …

基于SpringBoot的校園信息共享系統【2026最新】

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

PyTorch API 3 - distributed

文章目錄分布式通信包 - torch.distributed后端支持PyTorch 內置的后端選擇哪個后端&#xff1f;常見環境變量選擇使用的網絡接口其他NCCL環境變量基礎概念初始化返回類型&#xff1a;boolTCP初始化共享文件系統初始化環境變量初始化方法初始化后操作關閉處理重新初始化組Devic…

【K8s】整體認識K8s之Docker篇

首先認識幾個名詞&#xff0c;Docker-ce是docker的社區版本&#xff0c;提供給各種構建、發布、運行容器的工具&#xff1b;docker-ce-cli是社區版本的命令行工具&#xff0c;與docker守護進程進行交互&#xff1b;containerd.io是docker運行時&#xff08;containerd&#xff…

【機器學習】7 Linear regression

本章目錄 7 Linear regression 217 7.1 Introduction 217 7.2 Model specification 217 7.3 Maximum likelihood estimation (least squares) 217 7.3.1 Derivation of the MLE 219 7.3.2 Geometric interpretation 220 7.3.3 Convexity 221 7.4 Robust linear regression * 2…

【衛星通信】超低碼率語音編碼ULBC:EnCodec神經音頻編解碼器架構深度解析

引言 EnCodec是由Meta AI提出的一種端到端神經音頻編解碼器架構&#xff0c;其核心目標是在保證音頻質量的前提下實現高壓縮比和低帶寬傳輸。該模型通過結合卷積神經網絡、殘差矢量量化&#xff08;Residual Vector Quantization, RVQ&#xff09;、多尺度對抗訓練以及Transfor…

08_正則表達式

第8課:正則表達式 課程目標 理解正則表達式的基本概念 掌握常用的正則表達式模式 學習Python中re模塊的使用 能夠編寫簡單的正則表達式 1. 正則表達式基礎 1.1 什么是正則表達式 正則表達式是一種用于匹配字符串模式的工具,可以用于搜索、替換和驗證文本。 1.2 基本語法 …

小迪安全v2023學習筆記(七十一講)—— Python安全反序列化反編譯格式化字符串安全

文章目錄前記WEB攻防——第七十一天Python安全&反序列化利用鏈&PYC文件反編譯&格式化字符串安全Python - PYC-反編譯文件出源碼介紹演示Python - 反序列化-調用鏈&魔術方法各類語言序列化和反序列化函數序列化和反序列化含義Python中常用的序列化/反序列化函數…

Linux->多線程2

目錄 本文說明&#xff1a; 一&#xff1a;線程互斥 1&#xff1a;缺乏互斥的搶票系統 2&#xff1a;搶票系統分析及概念回顧 3&#xff1a;互斥鎖 ①&#xff1a;相關接口 a&#xff1a;定義鎖 b&#xff1a;初始化鎖 c&#xff1a;加鎖 d&#xff1a;解鎖 e&#x…

[OpenVela] 音樂播放器1.0

code: https://github.com/lvy010/vela/tree/main/music_player OpenVela 音樂播放器 基于 OpenVela 系統的嵌入式音樂播放器&#xff0c;使用 LVGL 圖形庫開發&#xff0c;支持 Wi-Fi 連接和本地音頻播放。 &#x1f4cb; 目錄 項目簡介功能特性系統要求項目結構快速開始配…

學習 Android (十六) 學習 OpenCV (一)

學習 Android (十六) 學習 OpenCV (一) 在前幾個章節中&#xff0c;我們對 NDK 相關的開發有了一定的了解&#xff0c;所謂磨刀不誤砍柴工&#xff0c;有了這些基礎的知識儲備之后&#xff0c;我們可以來簡單上手一下 OpenCV 相關的知識&#xff0c;接下來跟隨作者一起來學習吧…

人工智能之數學基礎:離散型隨機變量

本文重點 前面我們介紹了隨機變量具有兩個類型,一個類型是離散型隨機變量,另外一個類型是連續型隨機變量。我們先來學習離散型隨機變量。 離散型隨機變量 離散型隨機變量 X 所有可能取的值為X1,X2...,并且有: 則稱 p1 , p2, … 為離散型隨機變量 X 的概率質量函數。其中 …

【Java開發日記】我們來講一講 Channel 和 FileChannel

目錄 Channel FileChannel 打開 FileChannel 從 FileChannel 讀數據 寫數據到 FileChannel 關閉 FileChannel 示例 讀數據 寫數據 Channel 在 NIO 中&#xff0c;Channel 和 Buffer 是相輔相成的&#xff0c;只能從 Channel 讀取數據到 Buffer 中&#xff0c;或者從 …

【力扣】2623. 記憶函數——函數轉換

【力扣】2623. 記憶函數——函數轉換 文章目錄【力扣】2623. 記憶函數——函數轉換一、題目二、解決方案1、概述1.1純函數2、在Web開發中的記憶化用途2.1緩存網站文件&#xff08;1&#xff09;React 組件&#xff08;2&#xff09;緩存 API 調用3、算法中的記憶化4、專業實現的…

數據結構 -- 隊列

隊列的核心定義隊列是受限線性表&#xff0c;僅允許在一端&#xff08;隊尾&#xff09;插入元素、另一端&#xff08;隊頭&#xff09;刪除元素&#xff0c;遵循 “先進先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;” 原則。隊列的結構與操作端隊尾&#…