zoukankan      html  css  js  c++  java
  • 针对C++容器类的一个简陋的allocator

    参考:

    https://en.cppreference.com/w/cpp/named_req/Allocator

    http://www.josuttis.com/libbook/memory/myalloc.hpp.html

    template <class T>
       class MyAlloc {
         public:
           // type definitions
           typedef T        value_type;
           typedef T*       pointer;
           typedef const T* const_pointer;
           typedef T&       reference;
           typedef const T& const_reference;
           typedef std::size_t    size_type;
           typedef std::ptrdiff_t difference_type;
    
           // rebind allocator to type U
           template <class U>
           struct rebind {
               typedef MyAlloc<U> other;
           };
    
           // return address of values
           pointer address (reference value) const {
               return &value;
           }
           const_pointer address (const_reference value) const {
               return &value;
           }
    
           /* constructors and destructor
            * - nothing to do because the allocator has no state
            */
           MyAlloc() throw() {
           }
           MyAlloc(const MyAlloc&) throw() {
           }
           template <class U>
             MyAlloc (const MyAlloc<U>&) throw() {
           }
           ~MyAlloc() throw() {
           }
    
           // return maximum number of elements that can be allocated
           size_type max_size () const throw() {
               return std::numeric_limits<std::size_t>::max() / sizeof(T);
           }
    
           // allocate but don't initialize num elements of type T
           pointer allocate (size_type num, const void* = 0) {
               // print message and allocate memory with global new
               pointer ret = (pointer)(malloc(num*sizeof(T)));
               return ret;
           }
    
           // initialize elements of allocated storage p with value value
           void construct (pointer p, const T& value) {
               // initialize memory with placement new
               new((void*)p)T(value);
           }
    
           // destroy elements of initialized storage p
           void destroy (pointer p) {
               // destroy objects by calling their destructor
               p->~T();
           }
    
           // deallocate storage p of deleted elements
           void deallocate (pointer p, size_type num) {
               free((void*)p);
           }
       };
    
       // return that all specializations of this allocator are interchangeable
       template <class T1, class T2>
       bool operator== (const MyAlloc<T1>&,
                        const MyAlloc<T2>&) throw() {
           return true;
       }
       template <class T1, class T2>
       bool operator!= (const MyAlloc<T1>&,
                        const MyAlloc<T2>&) throw() {
           return false;
       }
  • 相关阅读:
    [MySQL优化案例]系列 — 分页优化
    [MySQL优化案例]系列 — RAND()优化
    CSS模块化思想-----命名是个技术活
    php curl选项列表(超详细)
    CURL使用介绍
    HTTP头信息
    git常用命令
    Git .gitignore文件说明
    yield(),wait(),sleep(),join()
    Java对象序列化和返序列化
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/11583360.html
Copyright © 2011-2022 走看看