简单空间配置器
来源:互联网 发布:如何快速网络招商 编辑:程序博客网 时间:2024/05/18 11:05
一个简单的空间配置器, JJ::allocator:
<span style="font-family:Courier New;font-size:14px;">#ifndef __JJALLOC_#define __JJALLOC_#include <new>// for placement new#include <cstddef>// for ptrdiff_t, size_t#include <cstdlib>// for exit()#include <climits>// for UINT_MAX#include <iostream>// for cerrnamespace JJ {template <class T>inline T* _allocate(ptrdiff_t size, T*) {set_new_handler(0);T* tmp = (T*)(::operator new((size_t)(size*sizeof(T))));if (tmp == 0) {cerr << "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);//placement new. 将p作为地址传入operate new函数//不进行分配操作, 调用T1::T1(value)}template <class T>inline void _destroy(T* ptr) {ptr->~T();}template <class T>class allocator {public:typedef Tvalue_type;typedef T*pointer;typedef const T*const_pointer;typedef T&reference;typedef const T&const_reference;typedef size_tsize_type;typedef ptrdiff_tdifference_type;template <class U>struct rebind {typedef allocator<U> other; //以list为例, allocator<int>::rebind<node>::other即为allocator<node>};//第二个参数是个提示, 实现上可能会利用它来增进区域性(locality), 或者完全忽略之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);}void construct(pointer p, const T& value) {_construct(p, value);}void destroy(pointer p) {_destroy(p);}pointer address(reference x) {return (pointer)&x;}const_pointer const_address(const_reference x) {return (const_pointer)&x;}size_type max_size() const {return size_type(UINT_MAX / sizeof(T));}};}#endif</span>
SGI标准空间配置器, std::allocator源码:
<span style="font-family:Courier New;font-size:14px;">#ifndef DEFALLOC_H#define DEFALLOC_H#include <new.h>#include <stddef.h>#include <stdlib.h>#include <limits.h>#include <iostream.h>#include <algobase.h>template <class T>inline T* allocate(ptrdiff_t size, T*) { set_new_handler(0); T* tmp = (T*)(::operator new((size_t)(size * sizeof(T)))); if (tmp == 0) {cerr << "out of memory" << endl; exit(1); } return tmp;}template <class T>inline void deallocate(T* buffer) { ::operator delete(buffer);}template <class T>class allocator {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; pointer allocate(size_type n) { return ::allocate((difference_type)n, (pointer)0); } void deallocate(pointer p) { ::deallocate(p); } pointer address(reference x) { return (pointer)&x; } const_pointer const_address(const_reference x) { return (const_pointer)&x; } size_type init_page_size() { return max(size_type(1), size_type(4096/sizeof(T))); } size_type max_size() const { return max(size_type(1), size_type(UINT_MAX/sizeof(T))); }};//模板特化需要加template<>, 此处为gcc特性class allocator<void> { public: typedef void* pointer;};#endif</span>
0 0
- 简单空间配置器
- 一个简单的空间配置器: allocator
- 【STL】实现简单的空间配置器
- 设计一个简单的空间配置器, JJ::allocator
- STL中设计一个简单的空间配置器
- c++实现一个简单的空间配置器allocator
- 设计一个简单的空间配置器 JJ::allocator
- 【STL】SGI版STL空间配置器剖析+简单实现
- 设计一个简单的空间配置器 JJ::allocator
- STL源码剖析_读书笔记:第二章 空间配置器 构建简单的空间配置器篇
- samba共享盘简单配置共享空间
- STL空间配置器
- STL空间配置器
- SGI_STL_空间配置器
- 15 空间配置器
- 2 空间配置器
- 空间配置器
- STL空间配置器
- iOS —— 内存泄露问题
- boost::random产生随机数的一种方法
- 信用卡3D验证相关资料
- 添加ftp用户及对应目录
- hdu 2112 HDU Today
- 简单空间配置器
- shell学习笔记1——基础篇
- 图像检索:RGBHistogram+欧几里得距离|卡方距离
- ASP.NET Web API之消息[拦截]处理
- 如何在Quartus II中设置Virtual pin
- 取消vs2013在solution中单击打开文件的功能
- android里,addContentView()动态增加view控件,并实现控件的顶部,中间,底部布局
- Piggy-Bank hdoj 1114
- 写代码的被美女老板看上——室内地图GIS