64,642
社区成员
发帖
与我相关
我的任务
分享
template<typename T>
class MPool
{
public:
MPool(uint64_t init_size)
: size(init_size)
{
mem = (T*) malloc(size*sizeof(T));
empty_nodes.insert(MPoolNode(0,size));
}
inline T& operator [] (uint64_t i)
{
if (i==0)
abort();
return mem[i-1];
}
// 这个指针存储一段连续的空间。
T* mem;
// 空间的尺寸(注意不是byte数,是对象数)
uint64_t size;
// 指向空余空间和已用空间的红黑树。
MPoolNodeSet empty_nodes;
MPoolNodeSet alloc_nodes;
};
class FooBar {
public:
FooBar(): foo(0), bar(0) {}
FooBar(int foo, int bar): foo(foo), bar(bar) {}
int foo;
int bar;
};
FooBarPool pool(10);
// allocate的时候分配n个对象的空间,返回它的index(基于1的)
uint64_t obj1_i = pool.allocate(1);
cout<<"obj1 index "<<obj1_i<<endl;
// 查看一下obj1的地址
FooBar& obj1 = pool[obj1_i];
cout<<"obj1 at "<<&obj1<<endl;
uint64_t obj_list_i = pool.allocate(9);
cout<<"obj list index "<<obj_list_i<<endl;
for (int i = 0; i<9; i++) {
uint64_t index = obj_list_i+i;
FooBar& curr = pool[index];
cout<<"list obj index "<<index<<" at "<<&curr<<endl;
}