《STL源码剖析》chapter2空间配置器allocator
为什么不说allocator是内存配置器而说是空间配置器,因为空间不一定是内存,也可以是磁盘或其他辅助介质。是的,你可以写一个allocator,直接向硬盘取空间。sgi stl提供的配置器,配置的对象是内存。
stl中allocator用法参考以前的http://www.cnblogs.com/youxin/archive/2012/06/07/2540170.html。
书中jj allocator类
#ifndef _JJALLOC
#define _JJALLOC
#include<new> //for placement new
#include<cstddef> //for ptrdiff_t ,size_t
#include<cstdlib> //for exit()
#include<climits> //for UINX_MAX
#include<iostream> //for cerr namespace JJ
{
template<class T>
inline T* _allocate(ptrdiff_t size,T*)
{
set_new_handler();
T* tmp=(T*)(::operator new((size_t)(size*sizeof(T))));
if(tmp==)
{
cerr<<"out of memory"<<endl;
exit();
}
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,invoke constuctor of t1
} template<class T>
inline void _destroy(T* ptr)
{
ptr->~T();
} 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; //rebind allocator of type U
template<class U>
struct rebind{
typedef allocator<U> other;
};
//需要加上以下2个函数,windows的编译器用到了allocator不同类型的拷贝,
allocator()
{
return ;
} template <class U>
allocator(const allocator<U>& c )
{
} //hint user for locality,第2个参数是个提示,实现上可能会利用它来增进区域性(locality),或完全忽略之 pointer allocate(size_type n,const void* hint=)
{
return _allocate((difference_type)n,(pointer));
} 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));
}
};
}//#end of namespace JJ
#endif
#include"2jjalloc.h"
#include<vector>
#include<iostream>
using namespace std; int main()
{
int ia[]={,,,,};
unsigned int i; vector<int,JJ::allocator<int> > iv(ia,ia+);
for(i=;i<iv.size();i++)
cout<<iv[i]<<ends;
cout<<endl;
}
这个allocator只能有限程序带票PJ STL,
《STL源码剖析》chapter2空间配置器allocator的更多相关文章
- STL源码剖析之空间配置器
本文大致对STL中的空间配置器进行一个简单的讲解,由于只是一篇博客类型的文章,无法将源码表现到面面俱到,所以真正感兴趣的码农们可以从源码中或者<STL源码剖析>仔细了解一下. 1,为什么S ...
- STL源码分析之空间配置器
前言 SGI STL将new的申请空间和调用构造函数的两个功能分开实现, 如果对new不太清楚的, 可以先去看看这一篇new实现再来看配置器也不迟. 本节是STL分析的第一篇, 主要分析STL各个部分 ...
- 《STL源码剖析》环境配置
首先,去侯捷网站下载相关文档:http://jjhou.boolan.com/jjwbooks-tass.htm. 这本书采用的是Cygnus C++ 2.91 for windows.下载地址:ht ...
- STL源码剖析:配接器
启 配接器就是适配器 STL中的适配器一共三种: 迭代器适配器 是一种观念上的改变,如将赋值操作变成插入,前进变成后退,等 函数适配器 STL中最广泛的配接器群体 可以实现连续配接 配接操作:bind ...
- STL源码剖析 — 空间配置器(allocator)
前言 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象都存放在容器之中. 你完全可以实现一个直接向硬件存取空间的allocator. 下面介绍的是SGI STL提供的配 ...
- STL源码剖析——空间配置器Allocator#1 构造与析构
以STL的运用角度而言,空间配置器是最不需要介绍的东西,因为它扮演的是幕后的角色,隐藏在一切容器的背后默默工作.但以STL的实现角度而言,最应该首先介绍的就是空间配置器,因为这是这是容器展开一切运作的 ...
- STL"源码"剖析-重点知识总结
STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...
- 【转载】STL"源码"剖析-重点知识总结
原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...
- (原创滴~)STL源码剖析读书总结1——GP和内存管理
读完侯捷先生的<STL源码剖析>,感觉真如他本人所说的"庖丁解牛,恢恢乎游刃有余",STL底层的实现一览无余,给人一种自己的C++水平又提升了一个level的幻觉,呵呵 ...
随机推荐
- Java基础知识强化之IO流笔记29:BufferedOutputStream / BufferedInputStream(字节缓冲流)之BufferedInputStream读取数据
1. BufferedInputStream读取数据 BufferedInputStream构造方法,如下: 构造方法摘要 BufferedInputStream(InputStream in) ...
- Google Map API v2 番外篇 关于gps位置偏差及修正方法探讨
我的手机是M35C,在我自己的map activity中,通过gps获取到的经纬度比实际地址总是有500米左右的偏差. 在网上搜索了很多,都说这个是测绘局为了保密故意弄成这样的.gps全球定位系统获得 ...
- Eclipse - 添加 PyDev 插件
1. 安装PyDev插件 启用Eclipse.在Help菜单中,选择Install New Software···, 然后点击Add按钮.在Location中输入:http://pydev.org/u ...
- Debian 8 编译安装nginx 1.8
1.安装编译环境 apt-get install build-essential apt-get install gcc make apt-get install libpcre+* apt-get ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(二)
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
- 19个非常有用的Javascript类库
Blackbird是一款非常酷的JavaScript调试工具,带有一个漂亮的界面显示和过滤调试信息. http://www.gscottolson.com/blackbirdjs/ Treesaver ...
- 自己做的demo---宣告可以在java世界开始自由了
package $interface; public interface ILeaveHome { public abstract int a(); public abstract int b(); ...
- AndroidStudio字体主题样式分享
最近慢慢在从eclipse往AndroidStudio习惯,但总觉得AS的默认字体颜色看的不舒服,便花了些时间将字体颜色样式改成了和原来类似的.以下是效果图. 这里是下载地址http://downlo ...
- Maven配置jar(war)包自动打包上传Maven服务器的配置
Maven配置jar(war)包自动打包上传Maven服务器的配置 创建jar(war)包工程 创建一个maven工程 在工程中穿件一个测试类 配置pom.xml <distributionMa ...
- IOS-UI- UIScrollView 滚动视图(1)
滚动视图多个页面实现的原理 滚动视图位置不变 内容的位置发生改变. 滚动视图的运用1.分页查看图片 2.查看大图片 3.当内容过多需要一个页面显示,如:注册,修改个人信息等等4.当不希望用户感觉咱们的 ...