glib中文参考手册,glibc文档

  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的工具。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: