因为单次分配内存,并不仅是指定大小,会额外在指定内存前后添加cookie空间(bookspace),这样的操作会导致,高频次申请内存实际消耗内存大于实际使用, 且增加了malloc(new)调用次数和时间消耗。
系统支持自定义策略,通过自己维护存池进行内存使用管理,减少malloc或new调用次数,以及cookie空间消耗。
如何支持自定义策略,c++支持重载全局的operator new 和类内operator new,具体使用如下例子:
#ifndef _mem_tst_h_
#define _mem_tst_h_
#include<stddef.h>
class foo{
public:
foo();
~foo();
void* operator new(size_t size);
void operator delete(void* p, size_t size);
private:
int a;
};
#endif
#include "foo.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
void* foo::operator new(size_t size){
cout<<"into new"<<endl;
return malloc(size);
}
void foo::operator delete(void* p, size_t size){
cout<<"into delete"<<endl;
free(p);
}
foo::foo(){
cout<<"foo cons"<<endl;
}
foo::~foo(){
cout<<"foo dis"<<endl;
}
int main(){
foo* p = new foo;
delete p;
return 0;
}
[fengdj@VM-0-14-centos mem_manage]$ ./a.out
into new
foo cons
foo dis
into delete
如何实现自定义内存池管理,玄机就在如何实现operator new 和operator delete,相关案例后面文章再述