zoukankan      html  css  js  c++  java
  • STL源码--空间配置器(一)

    一、STL空间配置器allcator的主要接口

    allocate

    deallocate

    construct

    destroy

    嵌套结构体:rebind

    这里稍微解释一下rebind的作用,常见用法如下,allocator<int>::rebind<char>::other;

    rebind主要是为了实现不同类型采用同样的内存分派的策略。

    例如:先看vector的分配器是allocator<T>,你要多少T就给你他就给你多少个T的对象。和new出来的一样。
    再看看list的分配器,同样也是allocator<T>,但是了解 链表 这个数据结构的都知道一个node应该是
    template<T>
    struct node
    {
       T data;
       node* prev;
       node* next;
    };
    所以allocator<T>就无法分配出一个node对象,而仅仅是T对象,象vector的那样。
    尽管list的allocator<T>和vector的allocator<T>是一样,但是list还是有其他的办法,它在内部由allocator<T>来获取适合它自己的分配器。
    allocator<T>::rebind<node<T> >::other,这个other就是allocator<node<T> >
    list就用这个other来分配内存了。

    这时候对list和vector都只需要传递allocator<T>的内存分配器就行。当然对list你也可以直接传递,allocator<node<T> >作为内存分配器。

    二、样例代码

    1: pointer allocate(size_type cnt, CHxAllocator<void>::const_pointer pHint = 0)
       2: {
       3:     UNREFERENCED_PARAMETER(pHint);
       4:  
       5:     if (cnt <= 0)
       6:     {
       7:         return 0 ;
       8:     }
       9:  
      10:     void* pMem = nullptr ;
      11:     if (max_size() < cnt || (pMem = malloc(cnt * sizeof(value_type))) == NULL)
      12:     {
      13:         throw std::bad_alloc(0);
      14:     }
      15:  
      16:     return static_cast <pointer>(pMem);
      17: }
      18:  
      19: void deallocate(pointer p, size_type)
      20: {
      21:     free(p);
      22: }
      23:  
      24: void construct(pointer p, const_reference val)
      25: {
      26:     :: new ((void *)p) T(val);
      27: }
      28:  
      29: void destroy(pointer p)
      30: {
      31:     p->~T();
      32: }
  • 相关阅读:
    Katalon系列十九:元素相同或无法定位时的定位技巧
    Katalon系列十八:用例变量&用例间调用
    读《单核工作法》
    Redis 的主从同步(复制)
    Yii2 框架整体结构
    redis 是如何做持久化的
    php yii 查看帮助时会调用具体脚本类的析构函数
    Redis 底层数据结构介绍
    Redis 的常用命令
    Yii2 框架跑脚本时内存泄漏问题分析
  • 原文地址:https://www.cnblogs.com/cane/p/3828782.html
Copyright © 2011-2022 走看看