zoukankan      html  css  js  c++  java
  • allocator

    allocator:

    通常c++内存配置和释放操作是这样的:

    class Fo{};
    Fo *p = new Fo;
    delete p;
    

    new算式主要有三个阶段:

    • 调用::operator new配置内存
    • 调用Fo::Fo()构造函数
    • 返回一个对象的指针

    allocator为了精密分工将步骤分开
    1.allocate()和deallocatr()负责内存的配置和释放
    2.construct()和destroy()负责对象的构造和析构

    • pointer->~T() 和 new(p) T1(value) 定位new

    空间配置和释放

    第一级:通过malloc、realloc和free。(::operator new无法可能是C++未有realloc这种内存重置函数)
    第二级:为了避免小额区块造成的内存碎片,用freelist管理小额区块
    如果大于128kb就用第一级


    freelist:

    union可以有多个数据成员,但是任意时刻只能有一个生效。共享内存,所以有时需要定位new。
    如果用其来实现链表,那么分配的内存既能用做指针,(不使用时)又能用做实际内容.

    union obj{
    union obj *free_list_link;
    char clent_data[1]; /* the client sees this */
    };
    

    一些内存处理工具

    uninitialized_copy();
    uninitialized_fill();
    uninitialized_fill_n();
    

    都能将内存的配置和对象的构造行为分离开来
    如果范围内每个迭代器都是未初始化的,会construct产生对象。


    参考:
    Effecti STL

  • 相关阅读:
    linux
    JAVA——遍历
    linux基础命令
    Java的反射和代理以及注解
    web 前端遇到的问题
    JTopo 使用
    阿里云服务器linux(cenos)下 jdk、tomcat的安装配置
    笔记--数据库总结
    0.01的区别
    犹豫——辛苦——坚持——收获 (2019北航软工培训总结)
  • 原文地址:https://www.cnblogs.com/Przz/p/6590998.html
Copyright © 2011-2022 走看看