c++---构建内存管理器

#include<iostream>
#include<sys/types.h>
#include<unistd.h>
#include<time.h>

using namespace std;


class IMemoryManager
{
public:
virtual void* allocate(size_t) = 0;
virtual void free(void*deleted) = 0;
};


class MemoryManager:public IMemoryManager
{
struct FreeStore
{
FreeStore *next;
};
void expandPoolSize();
void cleanUp();
FreeStore* freeStoreHead;


public:
MemoryManager()
{
freeStoreHead = 0;
expandPoolSize();
}
virtual ~MemoryManager()
{
cleanUp();
}
virtual void* allocate(size_t);
virtual void free(void* deleted);
};


MemoryManager gMemoryManager;
class Complex
{
public:
Complex(double a,double b):r(a),c(b){}
inline void* operator new(size_t);
inline void operator delete(void*deleted);
private:
double r;
double c;
};


inline void* MemoryManager::allocate(size_t size)
{
if(0 == freeStoreHead)
expandPoolSize();
FreeStore* head = freeStoreHead;
freeStoreHead = head->next;
return head;
}


inline void MemoryManager ::free(void* deleted)
{
FreeStore* head = static_cast<FreeStore*>(deleted);
head->next = freeStoreHead;
freeStoreHead = head;
}


void* Complex::operator new(size_t size)
{
return gMemoryManager.allocate(size);
}


void Complex::operator delete(void* pointerToDelete)
{
gMemoryManager.free(pointerToDelete);
}


#define POOLSIZE 32


void MemoryManager::expandPoolSize()
{
size_t size = (sizeof(Complex) > sizeof(FreeStore*))? sizeof(Complex):sizeof(FreeStore*);


FreeStore* head = reinterpret_cast<FreeStore*>(new char[size]);
freeStoreHead = head;


for(int i = 0;i<POOLSIZE;i++)
{
head->next = reinterpret_cast<FreeStore*>(new char[size]);
head = head->next;
}
head->next = 0;
}


void MemoryManager::cleanUp()
{
FreeStore* nextPtr = freeStoreHead;
for(;nextPtr;nextPtr = freeStoreHead)
{
freeStoreHead = freeStoreHead->next;
delete[]nextPtr;
}
}


int main()
{
time_t start,end;
start = time(NULL);
Complex* array[1000];
for(int i =0;i < 50000;i++ )
{
for(int j = 0;j < 1000;j++)
{
array[j] = new Complex(i,j);
}
for(int j = 0;j < 1000;j++)
{
delete array[j];
}
}
end = time(NULL);


cout<<"time "<<difftime(end,start)<<endl;


return 0;

}



对比运行时间


#include<iostream>
#include<unistd.h>
#include<time.h>


using namespace std;


class Complex
{
        public:
                Complex(double a,double b):r(a),c(b){}
        private:
                double r;
                double c;
};


int main()
{
        time_t start,end;
        start = time(NULL);
        Complex* array[1000];
        for(int i =0;i < 50000;i++ )
        {
                for(int j = 0;j < 1000;j++)
                {
                        array[j] = new Complex(i,j);
                }
                for(int j = 0;j < 1000;j++)
                {
                        delete array[j];
                }
        }
        end = time(NULL);

        cout<<"time "<<difftime(end,start)<<endl;

        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值