zoukankan      html  css  js  c++  java
  • c++ allocator类

       <memory>头文件提供了一个类allocator<T>,它可以分配用来保存T类型的对象的整块内存,而不需要初始化,并且他会返回一个指针,指向这块内存的首元素。这样的指针是危险的,因为他们的类型表面指向的是对象,但是这些内存却并不包含真正的对象。标准库还提供了一种方式在这些内存中构造对象,销毁对象--但是并没有释放内存。由程序员使用allocator类来确定哪些空间保存构造的对象,哪些空间还未初始化。

      对我们的目的来说,allocator类中最有趣的部分是,它包含4个成员函数和两个相关的 非成员函数(不仅仅只有4个,有多个重载版本)

    <template class T>class allocator{

    public :

    T* allocate(size_t);

    void deallocate(T*,size_t);

    void  construct(T*,const T&);

    void destroy(T*);

    //...

    };

    pointer allocate (size_type n, allocator<void>::const_pointer hint=0);                                                                                                                

         Allocate block of storage

    void deallocate (pointer p, size_type n); 释放为初始化的内存

          Releases a block of storage previously allocated with member allocate and not yet released

     void construct ( pointer p, const_reference val );                                                                                                                                     

       Construct an object

       Constructs an object of type T (the template parameter) on the location pointed by p using its copy constructor to initialize its value to val.

    Notice that this does not allocate space for the element, it should already be available at p (see member allocate to allocate space).

     It is equivalent to:

         new ((void*)p) T (val);

     
    void destroy (pointer p);                                                                        
      Destroy an object
      Destroys the object of type T (the template parameter) pointed by p.

    Notice that this does not deallocate space for the element. (see member deallocate to release storage space).

    It is equivalent to:  ((T*)p)->~T();
     
    address 

      obtains the address of an object, even if operator& is overloaded
     (public member function)

    rebind: 一个嵌套(nested)的class template,class rebind<U>拥有唯一成员other,那是一个typedef,代表allocator<U>

    参考:http://en.cppreference.com/w/cpp/memory/allocator

    Notes

    The member template class rebind provides a way to obtain an allocator for a different type. For example,

    std::list<T, A> allocates nodes of some internal type Node<T>, using the allocator A::rebind<Node<T>>::other (until C++11)
    std::list<T, A> allocates nodes of some internal type Node<T>, using the allocator std::allocator_traits<A>::rebind_alloc<Node<T>>, which is implemented in terms of A::rebind<Node<T>>::other if A is an std::allocator (since C++11)

     

     与allocator类相关的两个非成员函数是:
    template<class In,class For> For uninitialized_copy(In,In,For);
       作用于copy类似,把前两个参数指定的序列中的值,负责到第三个参数的目的序列中。
     
    template<class For,class T> vooid uniinitialized_fill(For,For,const T&) ; 使用指定值来填充未初始化的空间。
     

    列表:allocator类分配内存以及构建对象时候,常用的几个方法:

    allocator<T> a;

    Defines an allocator object named a that can allocate memory or construct objects of type T.

    a.allocate(n)

    Allocates raw, unconstructed memory to hold n objects of type T.

    a.deallocate(p, n)

    Deallocates memory that held n objects of type T starting at address contained in the T* pointer named p. It is the user's responsibility to run destroy on any objects that were constructed in this memory before calling deallocate.

    a.construct(p, t)

    Constructs a new element in the memory pointed to by the T* pointer p. The copy constructor of type T is run to initialize the object from t.

    a.destroy(p)

    Runs the destructor on the object pointed to by the T* pointer p.

     uninitialized_copy(b, e, b2)

    Copies elements from the input range denoted by iterators b and e into unconstructed, raw memory beginning at iterator b2. The function constructs elements in the destination, rather than assigning them. The destination denoted by b2 is assumed large enough to hold a copy of the elements in the input range.

     uninitialized_fill(b, e, t)

    Initializes objects in the range denoted by iterators b and e as a copy oft. The range is assumed to be unconstructed, raw memory. The objects are constructed using the copy constructor.

     uninitialized_fill_n(b, e, t, n)

    Initializes at most an integral number n objects in the range denoted by iterators b and e as a copy of t. The range is assumed to be at least nelements in size. The objects are constructed using the copy constructor.

     更多:

    http://mathbox59.blog.163.com/blog/static/12845359920102325635884/

    http://www.yekezhong.com/574

    http://cissco.iteye.com/blog/379093

    http://www.codeproject.com/Articles/4795/C-Standard-Allocator-An-Introduction-and-Implement

     http://en.cppreference.com/w/cpp/memory/allocator
     
     
     
  • 相关阅读:
    Jmeter设计压力测试场景&请求元件之并发场景设置&Jmeter查看压力测试结果&压力测试结果分析(二十九)
    Jmeter录制APP脚本(二十八)
    Jmeter优化web脚本&Jmeter回放web脚本和联调&Jmeter WEB脚本参数化(二十七)
    Jmeter结合badboy录制脚本(二十六)
    Jmeter录制WEB的原理(二十五)
    Jmeter实践:一粒云项目—Jmeter获取文件列表与下载接口串联测试及上传文件与下载接口之间的串联测试(二十四)
    Jmeter实践:一粒云项目—Jmeter完成文件的列表获取及JSON Extractor获取数组类型的数据及正则表达式获取数组类型的数据(二十三)
    Jmeter实践:一粒云项目—Jmeter完成文件下载及批量完成文件下载(二十二)
    Jmeter实践:一粒云项目—Jmeter完成文件上传及批量完成文件上传(二十一)
    Jmeter实践——新的项目介绍(二十)
  • 原文地址:https://www.cnblogs.com/youxin/p/2540170.html
Copyright © 2011-2022 走看看