zoukankan      html  css  js  c++  java
  • 自定义的allocator

    《STL源码剖析》学习笔记

    jjalloc.h

    #ifndef  JJALLOC_H
    #define JJALLOC_H
    #include<new>
    #include <cstddef>
    #include<cstdlib>
    #include<climits>
    #include <iostream>
    namespace JJ
    {
    template<class T>
    inline T* _allocate(ptrdiff_t size,T*){
        /*set_new_handler则是一个输入并返回
        new_handler类型的函数。set_new_handler的
        输入参数是operator new分配内存失败时要调
        用的出错处理函数的指针,返回值
        是set_new_handler没调用之前就
        已经在起作用的旧的出错处理函数的指针*/
        set_new_handler(0);
        T* tem=(T*)(::operator new((size_t)(size *sizeof(T))));
        if(tem==0){
            cout<<"out of memory"<<endl;
            exit(1);
        }
        return tem;
    }
    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);
    }
    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 alloctor of type u
        template<class U>
            struct rebind{
            typedef allocator<U> other;
        };
        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 //JJALLOC_H

    测试代码:

    #include "jjalloc.h"
    #include<iostream>
    using namespace std;
    class Test
    {
      public:
          int x;
          Test(int b=0){
              x=b;
              
          }
          ~Test(){
    
          }
    };
    int main()
    {
        int x=4;
        JJ::allocator<int> a;
        JJ::allocator<Test> b;
        int *p=a.allocate(1);
        Test *t=new Test;
        //new(p) T1(value) 这叫place new,在指针p所指向的内存空间创建一个
        //类型为T1的对象。调用的构造函数接受一个类型为const 
    //    T2&(或其他兼容类型)的参数
    //    new(&t) Test(x);
        b.construct(t,x);
        *p=1;
        cout<<*p<<endl;
        cout<<t->x<<endl;
        cout <<*(a.address(x))<<endl;
        cout <<a.max_size()<<endl;
        b.destroy(t);
        a.deallocate(p,1);
        return 0;
    }
  • 相关阅读:
    java位运算
    java笔试题(面试题)系列之一
    Java数据类型转换总结
    ++a和a++
    Java IO
    Java 并发
    Java位运算及补码存储
    Redis 5.0.0安装部署(伪集群版)
    Redis 安装(单机版)
    Dubbo源码分析系列之【服务暴露】
  • 原文地址:https://www.cnblogs.com/sklww/p/3521620.html
Copyright © 2011-2022 走看看