C++定长内存池

#pragma once
#include<iostream>
#include<vector>
#include<time.h>
using std::cout;
using std::cin;
using std::endl;
#ifdef _WIN32
#include<windows.h>
#else
#endif
//template<size_t N>
//class ObjectPool {
//
//};
inline static void* SystemAlloc(size_t kpage) {
#ifdef _WIN32
    void* ptr = VirtualAlloc(0, kpage * (1 << 13),MEM_COMMIT | MEM_RESERVE , PAGE_READWRITE);
#else
#endif
}
template<class T>
class ObjectPool {
public:
    T* New() {
        T* obj = nullptr;
        //优先把还回来内存快对像,再次重复利用
        if (_freeList) {
            void* next = *(void**)_freeList;
            obj= (T*)_freeList;
            _freeList = next;
            return obj;
        }
        else {
            //剩余内存不够一个对象大小时,重新开一快空间
            //_remainBytes
            if (_remainBytes < sizeof(T)) {
                _memory = (char*)malloc(128 * 1024);
                _remainBytes = 128 * 1024 ;//这个是我加上的
                if (_memory == nullptr) {
                    throw std::bad_alloc();//这个是在std的域里面的哦
                }
            }
            obj = (T*)_memory;
            size_t objSize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T);
            _memory +=objSize;//
            _remainBytes -= objSize;
            
        }
        //定位new,显示调用T的构造函数初始化
        new (obj)T;
        return obj;
    }
    void Delete(T* obj) {//把还回来的内存头插到_freeList中、
        
        obj->~T();//显示调用析构函数清理对象

        *(void**)obj = _freeList;
        _freeList = obj;
        
    }
private:
    char* _memory = nullptr;//指向大块内存的指针
    void* _freeList = nullptr;//还回来过程中链接的自由链表的头指针 这里你少了一个;号
    size_t _remainBytes = 0;//大块内存在切分过程中剩余字节数
};
struct TreeNode
{
    int _val;
    TreeNode* _left;
    TreeNode* _right;

    TreeNode()
        :_val(0)
        , _left(nullptr)
        , _right(nullptr)
    {}
};
void TestObjectPool()//测试性能代码
{
    // 申请释放的轮次
    const size_t Rounds = 5;

    // 每轮申请释放多少次
    const size_t N = 100000;

    std::vector<TreeNode*> v1;
    v1.reserve(N);

    size_t begin1 = clock();
    for (size_t j = 0; j < Rounds; ++j)
    {
        for (int i = 0; i < N; ++i)
        {
            v1.push_back(new TreeNode);
        }
        for (int i = 0; i < N; ++i)
        {
            delete v1[i];
        }
        v1.clear();
    }

    size_t end1 = clock();

    std::vector<TreeNode*> v2;
    v2.reserve(N);

    ObjectPool<TreeNode> TNPool;
    size_t begin2 = clock();
    for (size_t j = 0; j < Rounds; ++j)
    {
        for (int i = 0; i < N; ++i)
        {
            v2.push_back(TNPool.New());
        }
        for (int i = 0; i < N; ++i)
        {
            TNPool.Delete(v2[i]);
        }
        v2.clear();
    }
    size_t end2 = clock();

    cout << "new cost time:" << end1 - begin1 << endl;
    cout << "object pool cost time:" << end2 - begin2 << endl;
}
int main() {
    /*ObjectPool<double> op;
    cout << sizeof(op) << endl;
    double* p = op.New();*/
    TestObjectPool();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值