您的位置:首页 > 编程语言

STL源代码剖析个人总结1--STL的内存管理

2012-08-30 16:10 176 查看
一. 首先介绍一下C++中内存配置的方法:

1.C++ 中,内存的分配与构造紧密相连,就像对象和内存的回收一样。使用new表达式分配内存实际上包含了以下三个步骤:

<1> 申请内存空间: operator new

operator new:C++的标准的库函数。有两个重载的版本分别如下所示: (注意其返回值类型都是void*指针)

void* operator new(size_t) //用于申请单个对象的空间

void * operator new[](size_t) //用于申请数组空间

<2> 在申请的内存空间上构造对象: 定位new表达式

定位new表达式在已分配的内存空间中初始化对象。其不分配内存,但接受指向已分配但尚未构造没存的指针,并在该内存中初始化一个对象。表达式形式如下所示:

new (place_address) type //采用默认构造

new (place_address) type (initializer-list) //指定了初始化列表

<3>返回指向对象的指针 : 即将原先的指针先进行强制类型转换再返回即可

2. delete删除内存的操作实际上也包含了两个步骤: 析构对象-->释放内存

<1> 其中析构对象可以通过显式的调用对象的析构函数来完成。

<2> 内存释放是通过库函数operator delete来完成的其形式如下所示: (注意函数的参数是void*类型,使用时注意类型转换)

void* operator delete(void*) //释放单个对象的内存

void* operator delete[] (void*) //释放数组的内存

二. 来研究一下STL的空间配置器--allocator

1. 空间的申请与对象的构造

<1>. 申请空间: 通过函数 T* allocate(size_t, const void*=0) 来申请空间,申请的空间一字节为单位,且返回类型为T的指针指向申请而得的空间

<2>. 对象的构造: 通过函数 void construct(T*, value)来对申请来的空间进行构造,其本质上是通过定位new'操作来实现的。

2. 对象的析构与空间的释放

<1>. 对象的析构: 通过 void destroy(T*)函数来完成,其本质上市通过显式调用相应的析构函数来实现的,只不过针对不同的类型进行了特殊处理(特化与强化),以提高效率而已。

<2>. 空间的释放:通过函数 void deallocate(T*)来完成,能够释放指针T所指向的内存空间。

三. SGI STL版本中提供的双层空间配置器

其主要集中在三个文件当中:

stl_construct.h: 定义了两个全局函数 construct()和destroy()

stl_uninitialized.h: 定义了三个全局函数 un_initialized_copy(), un_initialized_fill(),un_initialized_fill_n()

stl_alloc.h: 定义了一二级空间配置器.

<1>. 第一级配置器:allocate() 直接通过malloc()实现,deallocate()直接用free()实现效率高。当内存不足时便模拟C++的set_new_handler()函数通过设置自己的空间不足时的处理机制来处理空间不足问题。

<2>. 第二级空间配置器:主要侧重于对小块内存片的管理,将不同大小的内存区块放入不同的链表进行管理,若需求区块大于128b,就转到第一级配置器。

双层空间配置器的优点:

可以方便的向system heap申请内存空间

可以充分考虑多线程的影响

考虑到了内存碎片及内存不足的处理方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: