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

  • 相关阅读:
    字符编码笔记:ASCII,Unicode 和 UTF-8
    nginx 负载均衡设置
    ubuntu 修改时区
    js 高阶函数 filter
    js 高阶函数 map reduce
    省市联级菜单--js+html
    php代码优化技巧
    json、xml ---- 数据格式生成类
    初识设计模式(1)---单例、工厂、注册树
    php 链式操作的实现 学习记录
  • 原文地址:https://www.cnblogs.com/Przz/p/6590998.html
Copyright © 2011-2022 走看看