Static allocator 3
来源:互联网 发布:java 微信支付api 编辑:程序博客网 时间:2024/06/05 09:47
当你受困于必须为不同的classes冲洗一遍几乎相同的member operator new 和 member operator delete时,应该有方法将一个总是分配特定尺寸之品魁的memory allocator概念包装起来,使它容易被重复使用。以下展示一种作法,每个allocator objec都是个分配器,它体内维护一个free-lists:不同allocator objects维护不同的free-lists
#include <iostream>#include <complex.h>using namespace std;namespace liuqi {class allocator {private:struct obj {struct obj* next; //embedded pointer};public:void* allocate(size_t);void deallocate(void*, size_t);private:obj* freeStore = nullptr;const int CHUNK = 5; //};void* allocator::allocate(size_t size) {obj* p;if(!freeStore) {size_t chunk = CHUNK * size;freeStore = p = (obj*)malloc(chunk);for(int i=0; i<(CHUNK-1); ++i) {p->next = (obj*)((char*)p + size);p = p->next;}p->next = nullptr; // last}p = freeStore;freeStore = freeStore->next;return p;}void allocator::deallocate(void* p, size_t size) {((obj*)p)->next = freeStore;freeStore = (obj*)p;} };class Foo {public:long L;string str;static liuqi::allocator myAlloc;public:Foo(long l): L(l) {}static void* operator new(size_t size) {return myAlloc.allocate(size);}static void operator delete(void* pdead, size_t size) {return myAlloc.deallocate(pdead, size);}};liuqi::allocator Foo::myAlloc;class Goo {public:complex<double> c;string str;static liuqi::allocator myAlloc;public:Goo(const complex<double> x): c(x) {}static void* operator new(size_t size) {return myAlloc.allocate(size);}static void operator delete(void* pdead, size_t size) {return myAlloc.deallocate(pdead, size);}};liuqi::allocator Goo::myAlloc;int main() {Foo* p[100];cout << "sizeof(Foo)= " << sizeof(Foo) << endl;for(int i=0; i<23; ++i) {p[i] = new Foo(i);cout << p[i] << ' ' << p[i]->L << endl;}for(int i=0; i<23; ++i) {delete p[i];p[i] = NULL;}Goo* pp[100];cout << "sizeof(Goo)= " << sizeof(Goo) << endl;for(int i=0; i<17; ++i) {pp[i] = new Goo(complex<double>(i, i));cout << pp[i] << ' ' << pp[i]->c << endl;}for(int i=0; i<17; ++i) {delete pp[i];pp[i] = NULL;}return 0;}
这比先前的设计干净多了,application classes不再内存分配细节纠缠不清,所有相关细节都让allocator去操心,我们的工作是让application classes正确工作
阅读全文
1 0
- Static allocator 3
- Macro for static allocator 4
- allocator
- allocator
- allocator
- allocator
- allocator
- memory managerment slab allocator(3)
- Solaris Slab Allocator–Magazines[3]
- slab allocator
- C++ Allocator
- allocator使用
- C++ Allocator
- hash_map && allocator
- Allocator rebind
- bootmem allocator
- 理解allocator
- std allocator
- idea创建项目报错 -Dmaven.multiModuleProjectDirectory system property is not
- 计算导论与C语言基础week8
- ubuntu 16.04 常用命令
- Android知识点小结
- matlab笔记(1)----基础
- Static allocator 3
- git rebase
- 智慧楼宇篇 1 —— 室内定位技术(一)
- 文件数据提取
- 关于char *和char [] 的不同
- #416 Div.2 A. Vladik and Courtesy-water
- Lintcode59 3Sum Closest solution 题解
- 四元数(Quaternion)和旋转
- Leetcode | 33. Search in Rotated Sorted Array