加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

空间配置器

发布时间:2020-12-14 04:18:20 所属栏目:大数据 来源:网络整理
导读:空间配置器的必要接口 ? ? allocator :: rebind 嵌套的class template,唯一成员other,代表allocator U allocator ::allocator 默认构造 allocator ::allocator(const allocator) 拷贝构造 template class Uallcotor::alocator(const allocatorU) 泛化的拷
  1. 空间配置器的必要接口

    ? ?

allocator::rebind

嵌套的class template,唯一成员other,代表allocator<U>

allocator::allocator

默认构造

allocator::allocator(const allocator&)

拷贝构造

template<class U>allcotor::alocator(const allocator<U>&)

泛化的拷贝构造

allocator::~allocator

析构

Pointer allocator::address(reference x) const

返回某个对象的地址 a.address(x) 等同于&x

Pointer allocator::allocator(size_type n,cosnt void * = 0)

配置空间,足以存储n个T对象

void allocator::deallocate(Pointer p,size_type n)

还原先前的配置空间

size_type allocatoe::max_szie() const

返回可成功配置的最大量

void allocator::construct(Pointer p,const T &x)

等同于 new((const void*)p T(x)

void allocator::destory(Pointer p)

等同于 p->T()

? ?

  • 9.29

    ? ?

    (1)ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。// ptrdiff_t stddef.h中定义,是一个signed 的类型

    ? ?

    (2)

    对于函数?set_new_handler函数的作用是设置new_p指向的函数为new操作或new[]操作失败时调用的处理函数。

    ? ?

    (3)#ifndef/#define/#endif的作用

    在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量"重定义"的错误。在头文件中实用#ifndef #define #endif能避免头文件的重定义。

    ? ?

    ? ?

  • 9.30

    ? ?

    (1)trivial destrutor

    如果用户不自定义析构函数,系统自带的,说明这个析构函数没什么作用,但会被自动调用,被称为trivial destrutor,相反,如果用户定义了析构函数,被称为 non_trivial destrutor,如果这个类里只有基本类型,没必要调用(写)析构函数,如果类中有个指向其它的指针,并且在构造中分配了内存空间,就必须释放这块,否则会内存泄漏。STL 有一个 has_trivial_destructor函数 用来检测。

    ? ?

    (2)static 函数

    静态函数有两种

    一种是静态成员函数,出现在类里

    调用这个函数不会访问或修改任何对象(非static)数据成员

? ?

全局静态函数不能被其他文件所用

? ?

  • 10.1

    ?

    配置器理解

    ? ?

    一个obj * freelist[16]

    ? ?

    管理大小分别为

    8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128

    ? ?

    freelist 实现技巧:
    obj 使用union,obj 可被视为一个指针,指向相同形式的另一个obj。也可以被视为指针,指向实际区块。

    ? ?

    申请bytes大小的内存,首先将bytes调整至8的倍数,再根据大小计算使用n号freelist

    ? ?

    ? ?

    使用了 n 号list之后,把 free_list[index]调整到指向下一区块

    如果当前freelist 没有区块了 用 refill 申请

    ? ?

    refill 的原理使用chunk申请20个(可能少于)内存块,一一配置到相应freelist的节点里

    ? ?

    chunk原理 从内存池中取块(因为内存池一开始是0,会用malloc向heap申请)

    四种情况:

    (1)可以申请 20 * bytes 返回首地址,修改内存池的大小(把起始地址改了)

    (2)可以申请小于 20*bytes 大于1 也返回首地址,并修改 nobjs,修改内存池大小

    (3)不能申请1 bytes数量的内存,将剩余一点内存编入,用malloc申请

    (4)malloc申请失败 山穷水尽。。。我选择死亡

    ? ?

    ? ?

  • 10.13

    进度缓慢

    ? ?

    理解空间配置器之后,就是迭代器

    ? ?

    为了推导迭代器的型别和特性,做了很多内嵌typedef

    根据STL标准,有五种iterator

    ? ?

    推导思路:

    利用泛型编程的参数推导机制

    ? ?

    用到这五种特性时自动转换为传入的泛型参数

    多嵌套一层因为无法推导返回值类型

    ? ?

    之后是原生指针的特化版本

    返回值是 iterator_traits 参数是<iterator>的类成员 iterator_category,就可以根据It 的实际类型推导

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读