C++实现多线程全局内存池

本文介绍了C++实现的多线程全局内存池,通过内存池数据结构示意图、完整的实现代码及与标准new、delete操作的性能对比,展示了内存池的核心思想,尽管代码仍有优化空间和可能存在的BUG。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.内存池数据结构示意图:



2.下面是完整实现代码包括与常规new,delete分配内存性能对比:

#include <Windows.h>
#include <iostream>
#include <map>
#include <assert.h>
#include <map>
#include <vector>
#include <time.h>

typedef int s32;
typedef unsigned int u32;
typedef char c8;
typedef long long s64;
typedef unsigned long long u64;
typedef void* LPVOID;
typedef unsigned char* LPBYTE;

//锁对象封装
class LockObject
{
    public:
        LockObject()
        {
            InitializeCriticalSection(&mLock);
        }
        ~LockObject()
        {
            DeleteCriticalSection(&mLock);
        }

        void Lock()
        {
            EnterCriticalSection(&mLock);    
        }

        void UnLock()
        {
            LeaveCriticalSection(&mLock);
        }

        bool TryLock()
        {
            return TryEnterCriticalSection(&mLock);
        }
    private:
        LockObject(const LockObject &other)
        {}
        LockObject& operator = (const LockObject &other)
        {}
    private:
        CRITICAL_SECTION mLock;
};

//锁定区域对象封装
class ScopeLock
{
    public:

        ScopeLock(CRITICAL_SECTION &lock)
            :mlock(lock)
        {
            EnterCriticalSection(&mlock);
        }
        ScopeLock(LockObject &lock)
            :mlock( reinterpret_cast<CRITICAL_SECTION&>(lock) )
        {
            EnterCriticalSection(&mlock);
        }
        ~ScopeLock()
        {
            LeaveCriticalSection(&mlock);
        }

    private:
        ScopeLock( const ScopeLock &other)
            :mlock(other.mlock)
        {}
        ScopeLock& operator = (const ScopeLock &other)
        {}
    private:
        CRITICAL_SECTION &mlock;
};

//内存块结构
typedef struct MemoryChunk
{
    u64 mID;            //块ID
    LPVOID mpData;        //真正的提供给外部分配内存
    u64 mDataSize;        //管理数据块的大小
    u64 mUsedSize;        //使用数据块大小
    MemoryChunk *mpNext;//下一个块
}* MemoryChunkPtr;

//内存池完整实现
class MemoryPool
{
public:
    
    MemoryPool(u64 MemoryBlockSize, u64 MemoryChunkSize )
    {
        mTotalMemoryPoolSize =
        mUsedMemorySize =
        mFreeMemorySize =
        mChunkIDPool = 0;

        mpBeginChunk =
        mpNearFreeChunk =
        mpEndChunk = nu
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值