(1)单线程内存池---专用Rational内存管理器

本文介绍了一个针对Rational类的内存管理方案,通过维护一个预分配对象的静态链表来减少内存分配与释放的开销。该方案适用于频繁创建和销毁Rational对象的场景,能够有效提高程序运行效率。

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

为避免频繁地使用默认内存管理器,Rational类要维护一个预先分配的
Rational对象的静态链表,该表列出空闲的可用对象。当需要Rational
对象时,可以从空闲列表中取出一个,使用后在把它放回空闲列表中以便今后分配

                          Rational 对象的空闲列表

 

#include <iostream>
#include <stdlib.h>
using std::cout;
using std::endl;

class NextOnFreeList
{
public:
        NextOnFreeList *next;
};

class Rational
{
public:
        Rational(int a = 0, int b = 1) : n(a), d(b) {}
        inline void *operator new(size_t size);
        inline void operator delete(void *doomed, size_t size);

        static void newMemPool() { expandTheFreeList(); }
        static void deleteMemPool();

private:
        static NextOnFreeList *freeList;
        static void expandTheFreeList();

        enum { EXPANSION_SIZE = 32 };

        int n;
        int d;
};

inline void * Rational::operator new(size_t size)
{
        if (NULL == freeList)
        {
                expandTheFreeList();
        }

        NextOnFreeList *head = freeList;
        freeList = head->next;

        return head;
}

inline void Rational::operator delete(void *doomed, size_t size)
{
        NextOnFreeList *head = reinterpret_cast<NextOnFreeList *>(doomed);
        if (NULL != head)
        {
                head->next = freeList;
                freeList = head;
        }
}

void Rational::expandTheFreeList()
{
        size_t size = (sizeof(Rational) > sizeof(NextOnFreeList *)) ?
                        sizeof(Rational) : sizeof(NextOnFreeList *);

        NextOnFreeList * runner = reinterpret_cast<NextOnFreeList *>(new char[size]);

        freeList = runner;
        for (int i = 0; i < EXPANSION_SIZE; ++i)
        {
                runner->next = reinterpret_cast<NextOnFreeList *>(new char[size]);
                runner = runner->next;
        }

        runner->next = NULL;
}

void Rational::deleteMemPool()
{
        NextOnFreeList *nextPtr = NULL;
        for (nextPtr = freeList; nextPtr != NULL; nextPtr = freeList)
        {
                freeList = freeList->next;
                delete []nextPtr;
                nextPtr = NULL;
        }
}

NextOnFreeList *Rational::freeList = NULL;

int main()
{
        Rational *arr[1000] = { NULL };
        Rational::newMemPool();

        for (int j = 0; j < 500; ++j)
        {
                for (int i = 0; i < 1000; ++i)
                        arr[i] = new Rational(i);

                for (int k = 0; k < 1000; ++k)
                        delete arr[k];
        }

        Rational::deleteMemPool();

        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值