fastalloc.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00040 #ifndef COL_FASTALLOC_H
00041 #define COL_FASTALLOC_H
00042
00043 #include "fastlib/base/base.h"
00044
00050 template<size_t item_size>
00051 class SlabAllocator {
00052 private:
00053
00054 static char *freelist_;
00055
00056
00057 public:
00058 static void AllocSlab();
00059
00060 static char *Alloc() {
00061 if (unlikely(freelist_ == NULL)) {
00062 AllocSlab();
00063 }
00064 char *item = freelist_;
00065 freelist_ = *reinterpret_cast<char **>(freelist_);
00066 return item;
00067 }
00068
00069 static void Free(char *item) {
00070 *reinterpret_cast<char**>(item) = freelist_;
00071 freelist_ = item;
00072 }
00073 };
00074
00075 template<size_t item_size>
00076 void SlabAllocator<item_size>::AllocSlab() {
00077 int slab_items = 128;
00078 size_t real_item_size = stride_align(item_size, char *);
00079 size_t size = real_item_size * slab_items + sizeof(char *);
00080 char *slab = mem::Alloc<char>(size);
00081
00082
00083
00084 *reinterpret_cast<char **>(slab) = freelist_;
00085
00086 --slab_items;
00087
00088 do {
00089 char *prev = slab;
00090 slab += real_item_size;
00091 *reinterpret_cast<char **>(slab) = prev;
00092 } while (--slab_items);
00093
00094 freelist_ = slab;
00095
00096
00097
00098
00099 }
00100
00101 template<size_t item_size>
00102 char *SlabAllocator<item_size>::freelist_ = 0;
00103
00124 #define fast_new(T) new(SlabAllocator<sizeof(T)>::Alloc()) T
00125
00137 template<typename T>
00138 inline void fast_delete(T *ptr) {
00139 ptr->~T();
00140 SlabAllocator<sizeof(T)>::Free(reinterpret_cast<char*>(ptr));
00141 }
00142
00143 #endif