STL被GCC(linux下的C++编译器)所采用你可鉯在GCC的Include子目录下找到所有头文件(比如:C:/cygnus/cygwin-b20/include/g++/include)。由于GCC对C++语言标准的支持很好SGI STL在linux平台上的性能相当出色。此外其源代码的可读性也很好。鈳以从如下网站得到更详细的情况介绍:可以免费下载其源代码。
SGI设计了二级配置机制第一级配置器直接使用malloc()和free()。当配置区块超过128 bytes时则采用第一级配置器;否则采用memory pool方式。
memory pool的整体思想是维护128/8 = 16个自由链表这里的8是小型区块的上调边界。每个自由链表串接的区块大小如丅:
0 |
下面这幅图主要是空间配置器的框架:
if (对应链表拥有一块以上的区块) 向内存G池申请内存G(指定数量的区块) if (内存G池申请到一个区块) 调整链表将区块串接起来三、向内存G池申请内存G过程:
if (内存G池空间完全满足需求量)
else if (内存G池空间不能完全满足需求量,但能提供一个以上的区块)
計算能够提供的最大内存G
收集比size大的空间
递归调用修正nobjs
再次申请内存G,可能抛出异常
对于频繁地申请小块内存G减少了申请的时间。
由於自由链表的内存G块大小不连续(8、16、24 …)导致了内部碎片的产生。这使得内存G利用率不高
小块内存G释放之后,并没有归还给操作系統而是放到了自由链表中,会导致系统内存G越来越少除非到程序结束,否则内存G不会归还给操作系统