SGI list内存管理分析

SGI list内存管理分析

6年前 (2013-05-01) 浏览: 16 评论: 2

list默认使用alloc作为空间配置器,alloc是什么?可以参考前面的文章,其实在这里可能是第一级空间配置器,也可能是第二级空间配置器。 还是那样为了满足标准,需要对配置器包装,在list中成为list_node_allocator. 所以list中就使用list_node_allocator作为配置器。可以如下使用: 下面来看看list中节点的构造。 首先看如何配置一个节点空间,并传回地址:

SGI list代码分析与原理解析[2]

SGI list代码分析与原理解析[2]

6年前 (2013-05-01) 浏览: 16 评论: 4

SGI list代码分析与原理解析[1]分析了list节点定义,迭代器定义,list类的定义。再来总结一下: 客户需要使用list这个容器,那么就需要通过list配套的迭代器iterator,所以list中有 这个迭代器如何与list关联的呢?比如客户有如下代码 客户想返回头迭代器,而list内部使用的是link_type。看下面的代码就知道了 list类定义中有 __list_iterator类

SGI list代码分析与原理解析[1]

SGI list代码分析与原理解析[1]

6年前 (2013-05-01) 浏览: 16 评论: 3

list内部采用双向链表实现,而且还是一个环状双向链表,使用一个指针就可以访问整个链表。list的每个节点定义如下。 那么list如下定义呢?一下只截取部分代码 在list的定义中,每个节点定义为typedef __list_node list_node; 那么指向每个节点的指针为typedef list_node* link_type; 前面说了,一个list,可以用一个指针访问,那么整个指针为

如何让自己的迭代器融入标准的STL框架

如何让自己的迭代器融入标准的STL框架

6年前 (2013-04-27) 浏览: 16 评论: 4

任何迭代器,如果想能与STL完美兼容,也即是能够使用STL的各种算法与各种工具。那么就得遵循它的要求,那就是有5个内嵌类型必须定义,这样就可以让traits萃取。但是在每个迭代器都去自己写这些确实容易遗忘,但是这里有一个较简单的方法来实现。那就是STL提供的iterator这个类,可以让自己定义的新的迭代器继承他。

STL中的特性萃取机iterator_traits

STL中的特性萃取机iterator_traits

6年前 (2013-04-26) 浏览: 23 评论: 2

很早以前,第一次看STL源码,第一次接触iterator_traits,我觉得他是一个巧妙的发明。 而现在再来看他,我觉得他变得更加绝妙。 iterator_traits是和迭代器在一起的,是针对迭代器来说的。也就是说通过iterator_traits可以了解到迭代器的信息和迭代器所指向元素的信息。 在编码的时候,往往需要定义一个迭代器指向对象类型的变量或者对象,我们可以利用函数模板推导来获得va

STL的第二级空间配置器代码分析[2]

STL的第二级空间配置器代码分析[2]

6年前 (2013-04-26) 浏览: 22 评论: 5

上面描诉了allocate函数,这个函数是标准配置器的接口函数。在该函数中,首先判断区块大小是否大于128字节,如果大于则调用第一级配置器,小于则检查对应的自由链表,如果对应的自由链表有可用的块则直接使用,否则将区块大小上升到8的倍数,调用refill重新填充空间。再来看看allocate的对立面deallocate,具体的意思看代码里的注释。

STL的第二级空间配置器

STL的第二级空间配置器

6年前 (2013-04-25) 浏览: 12 评论: 10

当申请的内存比较小时,频繁的申请与释放很容易造成碎片,而且还会造成配置的负担。所以当小额分配时,在内存池中进行分配,这样就避免了申请和释放带来的碎片,还避免了频繁申请带来的效率问题。 STL的第二级空间配置器的做法是:如果申请的内存大于128字节,则交给第一级,否则在第二级中用内存池管理。基本原理是,每次配置一大块内存,并用自由链表进行维护,内存的申请直接在自由链表中划拨。释放的内存则由自由链表回

切换注册

登录

忘记密码 ?

切换登录

注册

扫一扫二维码分享