设计一个简单的空间配置器
生活随笔
收集整理的這篇文章主要介紹了
设计一个简单的空间配置器
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//#ifndef GRAVELALLOC_H_INCLUDED
//#define GRAVELALLOC_H_INCLUDED#ifndef _GravelALLOC_
#define _GravelALLOC_
#include <new> // for placement new
#include <cstddef> // for ptrdiff_t, size_t ???
#include <cstdlib> //for exit()
#include <climits> //for UINT_MAX
#include <iostream> // for cerr
using namespace std;
namespace Gravel{template <class T>inline T* _allocate(ptrdiff_t size, T*){set_new_handler(0) ; // ?T* tmp = (T*) (::operator new((size_t) (size *sizeof(T)))); // :: operatorif(tmp == 0){cout << "out of memory" <<endl;exit(1);}return tmp;}template <class T>
inline void _deallocate (T* buffer){::operator delete(buffer);
}template <class T1,class T2>
inline void _construct(T1* p,const T2& value){new(p) T1(value); // 存放 new 調(diào)用 構(gòu)造函數(shù) T1 .沒理解 new(p)怎么玩的
}template <class T>
inline void _destory(T* ptr){ptr -> ~T();
}template <class T>
class alloctor{public :typedef T value_type;typedef T* pointer;typedef const T* const_pointer;typedef T& reference;typedef const T& const_reference;typedef size_t size_type;typedef ptrdiff_t difference_type;// rebind allocator of type U// allocator::rebind 是一個(gè)嵌套class template.class rebind<U>有唯一的一個(gè)成員other(是一個(gè)typedef,代表 allocate<U>)template <class U>struct rebind{typedef allocator<U> other;};//配置空間,可以滿足n個(gè)T對象 ,第二個(gè)參數(shù)是 一個(gè)提示。可以用這個(gè)參數(shù)來增加區(qū)域性,或者可以完全忽略pointer allocate(size_type n,const void* hint=0){return _allocate((difference_type)n, (pointer)0);}// 釋放先前配置的空間void deallocate (pointer p,size_type n){_deallocate(p);}// 等價(jià)于 new((void*) p) T(x) // ???沒有會等價(jià)void construct(pointer p,const T& value){_construct(p,value);}// 調(diào)用析構(gòu)函數(shù)void destory(pointer p){_destory(p);}//返回對象的地址pointer address(reference x){return (pointer)&x;}//返回一個(gè)const對象的地址const_pointer const_address(const_reference x){return (const_pointer)&x;}//返回最大可成功分配的空間size_type max_size() const{return size_type(UINT_MAX/sizeof(T));}};
}#endif // GRAVELALLOC_H_INCLUDED
#include "Gravelalloc.h"
#include <vector>
#include <iostream>
using namespace std;
int main(){int a[5]={0,1,2,3,4};vector<int,Gravel::alloctor<int> >v(a,a+5);for(int i=0;i<v.size();++i){cout<<v[i]<<' ';}cout<<endl;return 0;
}
?
總結(jié)
以上是生活随笔為你收集整理的设计一个简单的空间配置器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二进制相关
- 下一篇: 牛顿迭代法(Newton's Metho