遵照std::allocator实现自定制的内存分配器

下面是标准库STL中allocator的实现

template<class _Ty>

class allocator

: public _Allocator_base<_Ty>

{ // generic allocator for objects of class _Ty

public:

typedef allocator<_Ty> other;

typedef _Allocator_base<_Ty> _Mybase;

typedef typename _Mybase::value_type value_type;

typedef value_type *pointer;

typedef const value_type *const_pointer;

typedef void *void_pointer;

typedef const void *const_void_pointer;

typedef value_type& reference;

typedef const value_type& const_reference;

typedef size_t size_type;

typedef ptrdiff_t difference_type;

#if _HAS_CPP0X

typedef false_type propagate_on_container_copy_assignment;

typedef false_type propagate_on_container_move_assignment;

typedef false_type propagate_on_container_swap;

allocator<_Ty> select_on_container_copy_construction() const

{ // return this allocator

return (*this);

}

#endif /* _HAS_CPP0X */

template<class _Other>

struct rebind

{ // convert this type to allocator<_Other>

typedef allocator<_Other> other;

};

pointer address(reference _Val) const _NOEXCEPT

{ // return address of mutable _Val

return (_STD addressof(_Val));

}

const_pointer address(const_reference _Val) const _NOEXCEPT

{ // return address of nonmutable _Val

return (_STD addressof(_Val));

}

allocator() _THROW0()

{ // construct default allocator (do nothing)

}

allocator(const allocator<_Ty>&) _THROW0()

{ // construct by copying (do nothing)

}

template<class _Other>

allocator(const allocator<_Other>&) _THROW0()

{ // construct from a related allocator (do nothing)

}

template<class _Other>

allocator<_Ty>& operator=(const allocator<_Other>&)

{ // assign from a related allocator (do nothing)

return (*this);

}

void deallocate(pointer _Ptr, size_type)

{ // deallocate object at _Ptr, ignore size

::operator delete(_Ptr);

}

pointer allocate(size_type _Count)

{ // allocate array of _Count elements

return (_Allocate(_Count, (pointer)0));

}

pointer allocate(size_type _Count, const void *)

{ // allocate array of _Count elements, ignore hint

return (allocate(_Count));

}

void construct(_Ty *_Ptr)

{ // default construct object at _Ptr

::new ((void *)_Ptr) _Ty();

}

void construct(_Ty *_Ptr, const _Ty& _Val)

{ // construct object at _Ptr with value _Val

::new ((void *)_Ptr) _Ty(_Val);

}

#define _ALLOC_MEMBER_CONSTRUCT( \

TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, CALL_OPT, X2, X3, X4) \

template<class _Objty COMMA LIST(_CLASS_TYPE)> \

void construct(_Objty *_Ptr COMMA LIST(_TYPE_REFREF_ARG)) \

{ /* construct _Objty(_Types...) at _Ptr */ \

::new ((void *)_Ptr) _Objty(LIST(_FORWARD_ARG)); \

}

_VARIADIC_EXPAND_0X(_ALLOC_MEMBER_CONSTRUCT, , , , )

#undef _ALLOC_MEMBER_CONSTRUCT

template<class _Uty>

void destroy(_Uty *_Ptr)

{ // destroy object at _Ptr

_Ptr->~_Uty();

}

size_t max_size() const _THROW0()

{ // estimate maximum array size

return ((size_t)(-1) / sizeof (_Ty));

}

};

基于上述STL对于内存分配器的实现,如下是基于malloc,free和new,delete对该功能的实现

来自boost中pool的实现版本

#ifndef BOOST_SYS_ALLOCATOR_H

#define BOOST_SYS_ALLOCATOR_H

#ifdef _MSC_VER

#pragma warning(push)

#pragma warning(disable:4100)

#endif

// Symbols: malloc_allocator, new_delete_allocator

#include <cstddef>

#include <cstdlib>

#include <boost/limits.hpp>

#include <new>

template <typename T>

struct malloc_allocator

{

typedef T * pointer;

typedef const T * const_pointer;

typedef T & reference;

typedef const T & const_reference;

typedef T value_type;

typedef std::size_t size_type;

typedef std::ptrdiff_t difference_type;

template <typename U>

struct rebind

{

typedef malloc_allocator<U> other;

};

static pointer address(reference r) { return &r; }

static const_pointer address(const_reference r) { return &r; }

static pointer allocate(const size_type n, const void* = 0)

{

const pointer ret = (pointer) std::malloc(n * sizeof(T));

if (ret == 0)

throw std::bad_alloc();

return ret;

}

static void deallocate(const pointer p, const size_type)

{ std::free(p); }

static size_type max_size() { return (std::numeric_limits<size_type>::max)(); }

bool operator==(const malloc_allocator &) const { return true; }

bool operator!=(const malloc_allocator &) const { return false; }

malloc_allocator() { }

template <typename U>

malloc_allocator(const malloc_allocator<U> &) { }

static void construct(const pointer p, const_reference t)

{ new ((void *) p) T(t); }

static void destroy(const pointer p)

{ p->~T(); }

};

template <typename T>

struct new_delete_allocator

{

typedef T * pointer;

typedef const T * const_pointer;

typedef T & reference;

typedef const T & const_reference;

typedef T value_type;

typedef std::size_t size_type;

typedef std::ptrdiff_t difference_type;

template <typename U>

struct rebind

{

typedef new_delete_allocator<U> other;

};

static pointer address(reference r) { return &r; }

static const_pointer address(const_reference r) { return &r; }

static pointer allocate(const size_type n, const void* = 0)

{ return (pointer) new char[n * sizeof(T)]; }

static void deallocate(const pointer p, const size_type)

{ delete [] p; }

static size_type max_size() { return (std::numeric_limits<size_type>::max)(); }

bool operator==(const new_delete_allocator &) const { return true; }

bool operator!=(const new_delete_allocator &) const { return false; }

new_delete_allocator() { }

template <typename U>

new_delete_allocator(const new_delete_allocator<U> &) { }

static void construct(const pointer p, const_reference t)

{ new ((void *) p) T(t); }

static void destroy(const pointer p)

{ p->~T(); }

};

#ifdef _MSC_VER

#pragma warning(pop)

#endif

#endif

通过boost中pool的demo测试代码可以看出这三种的性能在vector中相差无几,、

但是使用boost::fast_pool_allocator在对set和list这样的数据结构中,性能提升了几倍

甚至几十倍。

遵照std::allocator实现自定制的内存分配器

时间: 2024-08-10 00:06:26

遵照std::allocator实现自定制的内存分配器的相关文章

利用std::allocator实现自定义的vector类

std::allocator即空间配置器,用于内存分配.更多的细节建议大家研究相关源码. 这里仅是利用std::allocator来实现简单的自定义vector类,如有问题欢迎指正. 1 #include <iostream> 2 #include <memory> 3 using std::cout; 4 using std::endl; 5 6 template <typename Tp> 7 class Vector 8 { 9 public: 10 Vector

C++ std::allocator&lt;T&gt;使用

基础知识通道:http://blog.csdn.net/Xiejingfa/article/details/50955295 C/C++: 1 #include <iostream> 2 #include <vector> 3 #include <string> 4 5 #define allocate_length 100000 6 7 8 int main() 9 { 10 11 //allocator比new快的原因:分离分配和初始化这两个操作allocator少

内存分配器 (Memory Allocator)

对于大多数开发者而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法.来UC前,我就是这样认为的.实际深入进去时,才发现这个领域里也是百家争鸣,非常热闹.有操作系统层面的内存分配器(Memory Allocator),有应用程序层面的,有为实时系统设计的,有为服务程序设计的.但他们的目的确认一样的,平衡内存分配的性能和提高内存使用的效率. 从浏览器开发的角度看,手机内存的增长速度相对于网页内容的增长仍然只是温暖水平,像Android这样的用内存大户更要算计着用

简单的内存分配器

采用自定义的operator运算符实现自己的内存分配策略,在某些时候可以提高程序的效率.   C++中的new运算符,具体工作流程如下: 1.调用operator new申请原始内存 2.调用place new表达式,执行类的构造函数 3.返回内存地址 而delete操作符的工作是: 1.调用对象的析构函数 2.调用operator delete释放内存 例如: #include <iostream> using namespace std; class Test { public: Test

[转]STL的内存分配器

题记:内存管理一直是C/C++程序的红灯区.关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍.另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等.最近阅读了一些内存管理实现方面的资料和源码,整理了一下,汇编成一个系列介绍一些常用的内存管理策略. 1. STL容器简介 STL提供

STL中的内存分配器原理

题记:内存管理一直是C/C++程序的红灯区.关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍.另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等.最近阅读了一些内存管理实现方面的资料和源码,整理了一下,汇编成一个系列介绍一些常用的内存管理策略. 1. STL容器简介 STL提供

STL的内存分配器

题记:内存管理一直是C/C++程序的红灯区.关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍.另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等.最近阅读了一些内存管理实现方面的资料和源码,整理了一下,汇编成一个系列介绍一些常用的内存管理策略. 1. STL容器简介 STL提供

内核的bootmem内存分配器【转】

转自:http://blog.csdn.net/zmxiangde_88/article/details/8041040 版权声明:本文为博主原创文章,未经博主允许不得转载. 在内核启动期间,伙伴系统内存管理器还没有建立之前,内核此时也要分配内存以及创建一些用于建立内存管理等机制的数据结构,此时内存分配和管理就是由bootmem内存分配器来完成的. bootmem的建立要求就是简单,越简单越好,因为一旦伙伴系统建立之后,就不需要bootmem了,因此对性能和通用性等要服从一切从简的原则.在了解这

[转]Linux内核最新的连续内存分配器(CMA)——避免预留大块内存

http://blog.csdn.net/21cnbao/article/details/7309757 在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用, 但是一般的做法又必须先预留着.目前,Marek Szyprowski和Michal Nazarewicz实现了一套全新的Contiguous Memory Allocator.通过这套机制,我们可以做到不预留内存,这些内存平时是可用的,只有当需要的时候才