C++小型内存池实现

这篇博客详细介绍了如何通过C++实现内存池,避免频繁的malloc调用,通过复用内存块来减少空间浪费,并优化new和delete操作,提高性能。关键在于使用静态数组和链表管理空闲对象,确保快速分配和释放。
摘要由CSDN通过智能技术生成
class Foo {
public:
    Foo(int x) : id(x) {}
    int getId() {return id;}
    ~Foo() {}

    void *operator new(size_t sizes) {
        Foo *p;
        if(!freeStore) {
            //linkList is empty
            size_t num = FooNum * sizes;
            freeStore = p = reinterpret_cast<Foo*>(new char [num]);

            while(p != &freeStore[FooNum - 1]) {
                p->next = p + 1;
                p++;
            }
            p->next = 0;
        }

        p = freeStore;
        freeStore = freeStore->next;
        return p;
    }
    void operator delete(void *p,size_t) {
        (static_cast<Foo*>(p))->next = freeStore;
        freeStore = static_cast<Foo*>(p);
    }
private:
    Foo *next;
    int id;
    static int FooNum;
    static Foo *freeStore;
};

int Foo::FooNum = 24;
Foo* Foo::freeStore = 0;

内存池的实现节省了空间和时间。
每次new一个对象都会存在一个cookie,如果连续new多个对象会有很多个cookie从而会浪费内存,内存池的实现则使得cookie变为一个,即只new一次。Foo中有一个int和一个指针(分别都是4字节)所以间隔8字节。
在这里插入图片描述
省的时间在于new底层会调用malloc,则因此减少了调用malloc的次数。精髓在于重载new和delete,此内存池里有一个指针指向下一个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值