zoukankan      html  css  js  c++  java
  • STL源代码剖析(一)

    Allocaor

    allocator 指的是空间配置器,用于分配内存。
    STL中默认使用SGI STL alloc作为STL的内存分配器,尽管未能符合标准规格,但效率上更好。
    SGI STL也定义有一个符合标准,名为allocator的配置器,但SGI自己从未使用过它,主要原因是它仅仅把C++的new操作符和delete操作符做了一层薄薄的封装。

    C++的new操作符和delete操作符进行内存配置时,new:先配置内存,然后构造对象。delete:先析构对象,然后释放内存。SGI STL将内存配置、释放内存与构造、析构分开。前者由<stl_alloc.h>中的allocate()和deallocate()负责,后者由<stl_construct.h>中的construct()和destroy()负责。 这两个头文件包括于<memory>中(STL标准规定,配置器定义在memory中)。同一时候<memory>还包括了一个文件<stl_unitialized.h>,定义了一些全局函数用来填充、复制大块内存数据。

    STL allocator中,alloc::allocate负责内存配置,alloc::deallocate负责内存释放,alloc::construct负责对象构造,alloc::destroy负责对象析构。

    SGI对空间的配置与释放的设计哲学:
    1.向system heap要求空间;
    SGI底层用的malloc和free完毕内存的配置和释放。
    2.考虑多线程状态;

    3.考虑内存不足时的应变措施;
    4.考虑过多“小型区块”可能造成的内存碎片问题。
    SGI设计了双层级配置器,第一级直接使用malloc和free,第二级配置器则视情况採用不同的策略:当配置区块超过128bytes时,视之为“足够大”,调用第一级配置器,当小于128bytes时,视之“过小”,为了减少额外负担,便採用复杂的memory pool方式,不再求助于第一级适配器。

    一二级配置器关系例如以下







    第一级配置器以malloc(),free(),realloc()等c函数运行实际的内存配置,释放,重配置操作,并实现相似 C++ new handler的机制(不能使用C++ new handler的原因时它并不是使用operator new 来配置内存)。

    小额区块带来的事实上不仅时内存碎片,配置时的额外负担也是一个大问题,额外负担无法避免。
    第二层配置器:假设区块勾搭,超过128bytes时,就移交第一层配置器处理,当区块小于128bytes时则以内存池管理。

    内存基本处理工具

    STL定义的五个全局函数
    construct() - 构造
    destroy() - 析构
    uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n() - 范围拷贝构造

    关于拷贝构造的三个函数,可以将内存的配置与对象的构造行为分离。假设作为输入目的地的[result, result + (last-first)]范围内的每个迭代器都指向未初始化的区域,则uninitialized_copy()使用copy constructor,将输入来源范围内每个对象产生一份复制品,放进输出范围中。

    容器的全区间构造函数通常以两个步骤完毕:
    1.配置内存区块,是以包括范围内的全部元素;
    2.使用uninitialied_copy(),在该内存区块上构造元素。

    它们负责在已分配好的空间进行构造。C++标准要求uninitialized_copy具有"commit or rollback"语义:要么做完,要么不做。

    在详细的实现中,这三个函数也用到了traits技法,通过traits萃取出元素的特性,假设是POD(Plain Old Data)型别,说明其拥有trivial ctor/ dtor/ copy/ assignment函数,因此可以使用copy()、fill()、fill_n()等算法,假设不是POD型别就仅仅可以循环调用construct()函数了。


    參考

    <<STL源代码剖析>> 侯捷译

  • 相关阅读:
    js
    css笔记整理
    JQ笔记
    好利吧:淘宝店家会不会是提高了宝贝价格所以才给返利的钱?
    好利吧:淘宝返利的钱从哪里来的?是我多付了钱吗?
    好利吧:告诉你一个不一样的购物方式
    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法
    MS SQL Server时间常用函数
    TOPAPI 消息通知机制
    云主机是什么?
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4509204.html
Copyright © 2011-2022 走看看