allocator自定义实现

#include <limits>
#include <iostream>
#include <deque>

namespace MyLib {
   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
           std::cerr << "allocate " << num << " element(s)"
                     << " of size " << sizeof(T) << std::endl;
           pointer ret = (pointer)(::operator new(num*sizeof(T)));
           std::cerr << " allocated at: " << (void*)ret << std::endl;
           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) {
           // print message and deallocate memory with global delete
           std::cerr << "deallocate " << num << " element(s)"
                     << " of size " << sizeof(T)
                     << " at: " << (void*)p << std::endl;
           ::operator delete((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;
   }
}

int main()
{
	// create a vector, using MyAlloc<> as allocator
	std::deque<int,MyLib::MyAlloc<int> > v;

	// insert elements
	// - causes reallocations
	v.push_back(42);
	v.push_back(56);
	v.push_back(11);
	v.push_back(22);
	v.push_back(33);
	v.push_back(44);
	v.push_back(42);
	v.push_back(56);
	v.push_back(11);
	v.push_back(22);
	v.push_back(33);
	v.push_back(44);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vector allocator是C++ STL库中vector容器的一个模板参数,用于指定容器的内存分配器。默认情况下,vector使用std::allocator作为其内存分配器,该分配器使用new和delete来分配和释放内存。 使用自定义allocator可以实现对内存分配和释放的控制,以满足特定的需求。自定义allocator必须满足allocator的要求,包括定义了一些成员函数,如allocate、deallocate、construct和destroy等。 下面是一个使用自定义allocator的示例: ```cpp #include <iostream> #include <vector> // 自定义allocator template <typename T> class MyAllocator { public: using value_type = T; T* allocate(std::size_t n) { std::cout << "Allocating memory for " << n << " elements" << std::endl; return new T[n]; } void deallocate(T* p, std::size_t n) { std::cout << "Deallocating memory for " << n << " elements" << std::endl; delete[] p; } template <typename... Args> void construct(T* p, Args&&... args) { new (p) T(std::forward<Args>(args)...); } void destroy(T* p) { p->~T(); } }; int main() { // 使用自定义allocator std::vector<int, MyAllocator<int>> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); for (const auto& num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; } ``` 运行上述代码,输出结果为: ``` Allocating memory for 1 elements Allocating memory for 2 elements Allocating memory for 3 elements 1 2 3 Deallocating memory for 3 elements Deallocating memory for 2 elements Deallocating memory for 1 elements ``` 该示例中,我们定义了一个名为MyAllocator自定义allocator,并将其作为vector的第二个模板参数。在自定义allocator中,我们重载了allocate、deallocate、construct和destroy等函数,以实现自定义的内存分配和释放逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值