glib中文参考手册,glibc文档
油嘴滑舌的学习笔记(4)-Innost的专栏-博客频道-CSDN。网
油嘴滑舌的学习笔记(4)
2010-04-13 17:40
75人阅读
评论(0)
收集
4.报告数据结构
这部分很重要。
4.1对于分配和管理而言,内存片是一个大小相等的高效类别。
这个新/删有什么特别的?
貌似效率更高,有分布式内存管理的嫌疑。推荐G_malloc系列。
我没看到什么特别的。现在使用malloc。
包括一个过时的gmemchunk类,这里就不描述了。
4.2双/单向链表GList是一个双向链表。仔细看看与STL相比有什么不同。
L GList内部单元都是从片分配器分配的,所以效率应该很高。
l分配列表* p=空
l插入、追加、前置、插入、插入_排序
l:移除
l:第一个,第n个,等等。
l遍历:foreach
l寻找index(此估计值由GList特别提供)index()
注意:GList没有一个单独的对象来表示整个队列集,不像STL使用List来表示整个队列集。内部单位是一个独立的东西。所以一定要注意GList的使用。GList本身就是一个单元,所以必须维护GList链表的头单元。
另外,GList是一个单元,内部有指向内存块的指针,GList本身可以从slice中分配。所以在freelist期间,单元本身返回slice,内部执行内存块需要自己释放。
它的find函数很有特点,find的比较参数是单元格中的数据指针。看来STL也是如此。如果有一个函数指针参数就好了。这需要find_custom函数。
单向链表用GSList就行了。
其他的好像也差不多,操作功能的效率也没提。因为不是泛型编程,所以没有API是通用的。
4.3 deque deque用GQueue表示,类似于STL。
GQueue有静态分配,上面的列表没有。这真的很奇怪。
看一下GQueue的内部结构,我们发现里面有两个GList。
有明确的功能。有xxx_link函数,link的参数是一个GList。前面的插入是一个数据data,内部会分配一个GList单元。
4.4序列sequence实际上是一个链表,由平衡树实现。
好像是一套。里面已经整理好了。
GSequence代表序列,需要通过GSequenceIter进行迭代。它的开始和结束位置与STL中的一致吗?最后一个在最后一个后面。Begin是第一个的前面。似乎这个开始是不同的。两边都是全开。另外,与STL中的迭代器不同,GSIter在整个操作过程中不会失效(除非删除元素),这点真的不一样。
如何解引用GSIter?难道也是指针的指针?我认为不是。
获取位置,如l begin: g_seqx_get_begin_iter,end_iter
附加、预先考虑等。返回iter。
这个序列中最重要的部分是find函数,这里称为search。
l迭代前后,iter_next,iter_prev
l解引用iter,使用g_sequence_get/set等。最好不要直接设置集合,否则无法排序。
有点麻烦,因为即使是最简单的int类型也要提供比较函数。不是有一些默认吗?
4.5 TrashStackGTrashStack,垃圾栈?目的是甚麽?用于回收未使用的内存块。不知道有什么用。如果不使用通用内存块,就直接释放。
从提供的API来看,似乎是一个保存空闲内存块的地方,但只是通过栈结构来存储。
4.6哈希表GHashTable表其实很有用,只是STL没有提供相应的对象。GLIB的哈希结构需要提供自己的哈希函数,比较麻烦。有默认的哈希函数吗?GLIB提供了字符串哈希函数、整数哈希函数等。使用起来极其方便。请注意以下几点:
l GLIB的hash不复制一个键和值,所以要自己保存。这是真的,因为C中没有运算符重载,也没有复制构造函数。
越来越觉得GLIB中API的封装很像并行开发学到的API编写,到处都是函数指针。
GHashTableIter,一般在栈上分配,然后初始化,和g_hash_table_iter_init一起使用。
如果哈希表在使用中被修改,iter将无效。
4.7字符串对象1。GString
GString类似于CString,但使用起来肯定没有对象封装的C方便。
GString内部数据指针由str表示。
2.GStringChunk
string的集合,和CStringArray类似吗?当需要操作很多字符串时,用这个比g_strdup更方便,因为不用频繁去malloc内存。
有几个功能需要特别注意:
Insert _ const和Insert,这里好像内部可以区分如何加入组块,搜索的时候可以区分类型。
4.8 Arrayg_array_free这个函数比较耐人寻味。如果free_segment为FALSE,将返回指向内部元素数据的指针。这是一个完整的记忆吗?从GArray的结构来看,好像是。
1.GPtrArray
存储指针的数组。和上面类似,但是可以设置element_destroy_func。
2.ByteArray
存储字节数组。
4.9平衡二叉树GTree提供了平衡二叉树的功能。其实这就是搜索二叉树,分为键和值。
对应STL中的贴图,使用红黑树。
GTree提供遍历接口GTraverseType,和Tree完全一样,比如中序、前序、后序、层次遍历。
4.10 N序树很少使用。GNode代表一个节点,没有单独的数据结构代表一个集合。
算了,关键还是看应用需求。
4.11夸克对夸克.这个不知道怎么翻译,实际作用是把一个字符串对应到一个GQuark对象上。在某种意义上,我们可以把它看作是字符串的散列。
请注意,这不是一个集合。GQuark应该是一个单位,这个单位的值是用一个字符串计算出来的。好像g夸克也是作为一组单位来用的,后面会用到。
内夸克是一个整数。看看API,有没有一个庞大的集合来存储里面的字符串,这样就可以避免相同内容的字符串产生相同的夸克?
查看实现,其中有一个全局哈希表。
4.12具有键值的数据列表键控数据列表data提供了通过CQuark模式快速访问的接口。这是实际的散列操作。为什么会有这样的需求?可能用在像GObject这样的地方,字符串被广泛地用来表示键。
4.13数据集的使用是特殊的。目的很明确。
一定有什么东西被全球保存在某个地方。数据集没有相应的数据结构。
这个怎么用?你每次都要找出一个位置吗?
很奇怪。但是好像很有用。
4.14关系和元组关系/元组和Erlang中的相似吗?
GRelation是一个表,其中的项是GTuples,每个GTuple包含多列(目前限制为2列)。
有点像列表控件。
4.15 CacheGlib还封装了缓存机制,这很少见.而且具体设计也用key/value,这是必须的。
API有自己的特点。如果插入的键不存在,将通过回调创建值,然后返回该值。这与我们过去认为的先创建键和值,然后再将它们相加的方式完全不同。
4.16不再谈论过时的内存分配。
油嘴工具
Glib-gettextize,为什么?对于国际使用,请参考gettextize。为了系统的国际化和本地化,在编译程序时可以使用NLS,程序的输出可以使用用户设置的语言而不是英语。
单元测试程序。并将结果格式化为XML/HTML。
Gtester-report:一个将XML格式化为HTML的工具。