码迷,mamicode.com
首页 > 其他好文 > 详细

Allocator

时间:2020-01-11 00:11:50      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:ast   mes   enc   show   pac   ref   back   cout   min   

// 内存分配器 Allocator
#include <vector>
#include <iostream>
using namespace std;

template<typename _Ty>
struct Allocator_base {
    using value_type = _Ty;
};

template<typename _Ty>
struct Allocator_base<const _Ty> {
    using value_type = _Ty;
};

template<typename _Ty>
class Allocator : public Allocator_base<_Ty> {
public:
    //inner type of data
    typedef size_t size_type;
    typedef ptrdiff_t difference_type;  //type of the minus of two pointers
    typedef _Ty* pointer;
    typedef _Ty& reference;
    typedef const _Ty& const_reference;
    typedef const _Ty* const_pointer;
    typedef Allocator_base<_Ty> _My_base;
    typedef typename _My_base::value_type value_type;

    template<typename _U>
    struct rebind {
        typedef Allocator<_U> other; // type_cast if the type is difference(type not unique)
    };

    Allocator() = default;
    Allocator(const Allocator&) = default;
    
    template<typename _otherAll>
    Allocator(const Allocator<_otherAll>&) noexcept {};

    ~Allocator() = default;

    //apply memory 
    pointer allocate(size_type num, typename Allocator<_Ty>::const_reference hint = 0) {
        //------------------------------show information
        static int i = 0;
        ++i;
        cout << endl;
        cout << "the nums of allocate memory :" << num << endl;;
        cout << "------------------------------------------\n";
        cout << "allcation of room " << num << endl;
        //-----------------------------
        return (pointer)(::operator new(num * sizeof(_Ty)));
    }

    // construct obj in memory
    void construct(pointer p, const_reference value) {
        new (p)_Ty(value); // (one of overloads of operator new) placement new
    }

    //destory obj
    void destory(pointer p) {
        p->~Ty();
    }

    // relese memory
    void deallocate(pointer p, size_type size) {
        ::operator delete(p);
    }

};

// test code
template<typename T>
void print(vector<T, Allocator<T>>& v) {
    cout << "the capacity of container is " << v.capacity() << "\n";
    cout << "the size of container is  " << v.size() << endl;
    for(auto i : v)
        cout << i << ‘ ‘;
    cout << endl;
}

int main() {
    vector<int, Allocator<int>> vec{1,2,3};
    print(vec);

    for(int i = 0; i < 10; ++i) {
        vec.push_back(10 * i);
        print(vec);
    }

    return 0;
}

  

Allocator

标签:ast   mes   enc   show   pac   ref   back   cout   min   

原文地址:https://www.cnblogs.com/MasterYan576356467/p/12178408.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!