什么是内存池
内存池(Memory Pool)是一种内存分配方式,又被称为固定大小区块规划(fixed-size-blocks allocation)。通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能
在程序需要内存的时候,通常有两种分配内存的方式,直接找块内存分配内存或者让操作系统去调用内存池
为了统计两者的效率区别,分别用两种方式分配内存
程序为Block分配0xfffffff次内存,然后释放掉
使用new去分配内存
#include<iostream>
#include<time.h>
using namespace std;
#define BLOCK_SIZE 1024
class Block
{
char chBuf[BLOCK_SIZE];
};
int main()
{
clock_t start = clock();
for(unsigned int i = 0; i<0xfffffff;i++)
{
Block *p_Block = new Block;
delete p_Block;
}
cout<<clock()-start<<endl;
}
程序运行时间为
避免系统调用,重载new完成内存分配
#include<iostream>
#include<time.h>
using namespace std;
#define BLOCK_SIZE 1024
char buf[4096];
class Block
{
char chBuf[BLOCK_SIZE];
public:
void *operator new(size_t size)
{
return (void*)buf;
}
void operator delete(void *p){}
};
int main()
{
clock_t start = clock();
for(unsigned int i = 0; i<0xfffffff;i++)
{
Block *p_Block = new Block;
delete p_Block;
}
cout<<clock()-start<<endl;
}
程序运行时间为:
两者的差距差距大于十倍
总结
new运算符重载后避免了使用malloc/free这类的系统调用,系统调用是非常消耗时间的,手动找一片内存空间手动去分配空间和释放空间是性能更高的选择方式