zoukankan      html  css  js  c++  java
  • STL之内存处理

    说明:本文仅供学习交流,转载请标明出处,欢迎转载!

               STL中与内存配置相关的类是allocator类,头文件为:#include<alllocator>这是一个模板类,用于内存的分配、对象的构造、对象的析构和空间的删除。本文主要介绍下相关的函数。

           内存空间的分配:allocate函数

           allocate函数原型为:iter allocate(n,T*)。分配足以容纳n个T对象的空间,返回指向所分配空间的首地址

           对象的构造:construct函数

           construct函数原型为:void construct(T1 *p,const T& value)。用值value去初始化p所指向的地址。

           对象的析构:destroy函数

           destroy函数原型为:void destory(T *p),析构p所指向的对象。

           内存空间的释放:deallocate函数

           deallocate函数原型为:void deallocate(T *p,size_type n)。将p所指向的n个T类型对象所占用的内存释放掉。

           以下的几个函数中。我们用“已知”表示“已经构造”,用“未知”表示“尚未构造”,所谓“未构造”指的是“已分配的空间尚未使用“。

           将已知范围的元素拷贝到还有一个未知区域:uninitialized_copy函数

           uninitialized_copy函数原型为:iter uninitialzed_copy(b,e,b1),将迭代器范围[b,e)所指向的元素依次拷贝到[b1,b1+(e-b) )的区域,返回值为iter=b1+(e-b)所指向的空间

            将某个值去填充一个未知区域:uninitialized_fill

            uninitialized_fill函数原型为:void unitialized_fill(b,e,t)。用值t去填充迭代器范围[b,e)所指向的区域。

            用n个同样值去填充某个未知区域:uninitialized_fill_n

            uninitialized_fill_n函数原型为:iter uninitialized_fill(b,n,t),用值t去填充迭代器范围[b,b+n)所指向的区域,返回迭代器 b+n

            Notice:后三个uninitialized_xxx函数的作用都是用批量初始化一个未知区域(即未使用区域),这三个函数的内部实现中有两个值得注意的地方:

            1.严格遵守"commit or rollback"原则。该原则规定,在批量初始化过程中。要么产生全部的必要元素。要么不产生一个元素,即要么不做,做了就做好做全。

            2.在初始化过程中,会先推断待初始化的元素类型是否为内置类型,若为内置类型POD(Plain Old Data),则直接调用更加底层的函数,上面三个函数相应的底层函数分别为:memmove(b1,b,e-b)、fill(b,e,t)和fill(b,n,x)。若数据类型为其它类型,则循环调用construct(iter,t)函数,这样做的目的是为了提高效率。

    參考文献:

    [1]《C++primer 第4版》

    [2]《STL源代码剖析 侯捷》

  • 相关阅读:
    ceph(4)--Ceph 的基础数据结构
    ceph(3)--Ceph 物理和逻辑结构
    ceph(2)--Ceph RBD 接口和工具
    ceph(1)--安装和部署
    Ceph中文文档
    Linux系统介绍(五)常用命令
    Linux系统介绍(四)IO重定向与管道
    剑指offer:跳台阶
    剑指offer:斐波那契数列
    剑指offer:旋转数组的最小数字
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6700674.html
Copyright © 2011-2022 走看看