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

  • 相关阅读:
    Java--动态代理
    java-finalize
    Oauth1.0认证过程
    深入理解-HashMap
    Java--对象内存布局
    Java--finally
    一个非常有用的算法---统计二进制数中1的个数
    进程之间通信
    SpringMVC听课笔记(十三:使用拦截器)
    SpringMVC听课笔记(十二:文件的上传)
  • 原文地址:https://www.cnblogs.com/Przz/p/6590998.html
Copyright © 2011-2022 走看看