Glib学习笔记(4)

news/2024/7/20 16:07:25 标签: 数据结构与算法, 内存管理, c/c++

数据结构

这部分非常重要。

4.1 内存片管理

memory slices是一个高效的分配和管理等尺寸的类。

这个和普通的new/delete相比有什么特别之处?

似乎更高效,有分布式内存管理“之嫌“。建议替代g_malloc系列。

没看出什么特别之处啊,暂时用malloc

包括一个过时的gmemchunk类,这里不叙述了。

4.2 /单向链表

GList是双向链表。仔细看看和STL相比提供了哪些不同之处。

l GList内部单元都是从slice allocator中分配得来的,所以应该很高效。

l 分配GList* p = NULL

l 插入用,append,prepend,insert,insert_sorted

l 删除:remove

l 迭代:first,nth

l 遍历:foreach

l 查找index(这个估计是GList特别提供的)index()

注意:GList没有一个单独的对象来表示整个队列集合,不像STL就用list来表示整个集合。内部单元是单独的一个东西。所以使用GList一定要注意了,GList本身就是单元,所以一定要维护GList链表的头单元。

另外,GList是单元,内部有指针指向内存块,GList本身是可以从slice中分配得来的。所以free Glist的时候是将单元本身返回slice中,而内部的执行内存块需要自己去释放。

它这个find函数很有特点,find的对比参数是单元中的data指针。好像STL中的也是这样的哈。要是有个函数指针参数就好了。这就得用到find_custom函数了

单向链表用GSList就行了。

其他好像差不多,没有提到过操作函数的效率问题,因为不是泛型编程,所以没有哪个API是通用的。

4.3 双端队列

双端队列用GQueue表示,这个和STL类似。

GQueue有静态分配的,而上述的list没有。这点真的很奇怪。

看了GQueue的内部结构,发现里边是两个GList

clear函数了。这里有xxx_link函数,link的参数是一个GList。前面的insert等是一个数据data,内部会分配一个GList单元的。

4.4 序列

序列实际是一个内部采用平衡树来实现的链表。

看来就是一个set吧,内部是排序的。

GSequence代表序列,需要用GSequenceIter来迭代,它这个beginlast位置是否和STL中的一致呢?last是最后一个的后边。begin是第一个的前边,看来就这个begin不一样,双方都是全开空间。另外,不像STL中的迭代子,GSIter在整个操作过程中不会无效(除非删掉该元素),这一点确实比较不一样。

怎么解引用GSIter?也是一个指针的指针吗?应该不是。

l 获取begin等位置:g_seqx_get_begin_iter,end_iter

l append,prepend等返回iter

l 序列最重要的是find函数,这里叫search

l 迭代前后,iter_next,iter_prev

l 解引用iter,用g_sequence_get/set等,set最好不要直接去设置,否则就不会排序了。

有点麻烦,因为即使最简单的int类型都得提供一个比较函数,难道没有些默认的吗?

4.5 TrashStack

GTrashStack,垃圾栈?目的是什么?用于回收不用的内存块。不知道有什么用。一般要是内存块不用的话直接就free了。

从提供的API来看,似乎就是一个保存free内存块的地方,只不过用stack结构来存储罢了。

4.6 Hash

GHashTable表实际非常有用,但是STL并没有提供对应的对象。GLIBhash结构需要自己提供hash函数,这个比较麻烦,有没有默认的hash函数呢?GLIB提供了字符串哈希函数,整型hash函数等。极大方便使用了。注意以下:

l GLIB的哈希并不copy一份keyvalue,所以得自己保存。这个确实也是,因为C中没有运算符重载之说,也没有拷贝构造函数。

越来越感觉GLIBAPI的封装与从并行开发中学到的API编写非常类似,到处是函数指针。

GHashTableIter,一般在栈上分配,然后用g_hash_table_iter_init来初始化并使用之。

在使用中如果修改了HASH表,将使得iter无效。

4.7 String对象

1. GString

GString类似CString,但使用上肯定不如对象封装的C++方便。

GString内部数据指针由str指示。

2. GStringChunk

一个string的集合,难道类似CStringArray?当许多string需要操作的时候,用这个比g_strdup要方便,因为它不会频繁得去malloc内存。

有几个函数需要特别注意:

l insert_constinsert,这里内部好像会区分是怎么加入到chunk中的,而且搜索的时候会区分开来类型。

4.8 Array

g_array_free这个函数比较让人思考。如果free_segmentFALSE的话将返回内部element-data的指针。难道内部是一整块内存吗?从GArray的结构来看好像确实是。

1. GPtrArray

存放指针的array。与上面的差不多,不过可以设置element_destroy_func

2. ByteArray

存放Bytearray

4.9 平衡二叉树

GTree提供平衡二叉树的功能。这个其实就是搜索二叉树有keyvalue之分。

对应STL中的map,用得是红黑树。

GTree提供遍历接口,GTraverseType,和树完全一样,如中序,前序,后序,层级遍历。

4.10 N序树

这个用得很少,GNode表示一个节点,没有单独的表示集合的数据结构。

不说了,关键还是看应用需要。

4.11 Quarks

GQuark。不知道这个怎么翻译,但实际作用就是将一个字符串与一个GQuark对象对应。姑且可以看做是某种意义上的Stringhash

注意,这个不是一个集合。GQuark应该是一个单元,这个单元的值由一个string计算得来,看来还有使用GQuark作为单元的集合,后续会用到。

内部GQuark就是一个整数。看API,难道内部有一个巨大的集合来存储string,这样可以避免同一个内容的string来产生一样的quark

看了下实现,果真里边有一个全局的HashTable

4.12 带关键值的数据列表Keyed Data List

GData提供了通过CQuark方式来快速访问的接口。实际就是Hash操作,为啥会有这种需求?大概用在GObject这种大量使用字符串来表示key的地方。

4.13 数据集Data Sets

用法很奇特。目的比较明确。

哪儿肯定有全局的东西在保存着。dataset没有对应的数据结构。

怎么用这个啊?难道每次都要先搞一个location出来吗?

非常奇特。但好像很有用。

4.14 关系和元组 Relations and Tuples

GRelation/GTuples,难道类似Erlang中的吗?

GRelation是一个表,里边的itemGTuples,每个GTuple含多个列(目前限2列)。

有点像列表控件。

4.15 Cache

GlibCache机制还进行了封装,难得....,具体设计上也用都了key/value,这个是必须的。

API使用有特点,如果插入的key不存在,则通过回调方式来创建value,然后就返回这个value。这个和我们以前想的先创建keyvalue,然后再加进去的方法完全不一样。

4.16 过时的内存分配

不再多说。

Glib工具

glib-gettextize,干嘛使的?国际化用的,参考gettextize。用于系统的国际化和本地化,可以在编译程序的时候使用本国语言支持(NLS),可以使程序的输出使用用户设置的语言而不是英文。

gtester:单元测试程序。并将结果格式化输出成XML/HTML

gtester-report:格式化XMLHTML的工具。


http://www.niftyadmin.cn/n/1012335.html

相关文章

QTP的历史

2019独角兽企业重金招聘Python工程师标准>>> QuickTest Professional 1.0 (QTP 1.0) QuickTest Professional 1.0发行于1998年5月,取名为Astra QuickTest仅支持WEB, 它是一种基于图标的功能测试工具,主要用于电子商务领域可以记录用户动作来简化并加速测试过程标价4…

随想 所感

今天在跟朋友聊天过程中,不经意间发现,原来我们已经不再是学生了。我们早已离开象牙塔三四个月了,而在在三四个月中,思想却停滞在象牙塔中。我不禁自问,我这是怎么了,现在我或许该做点什么来改变现状。 来公…

【刷题】字符串旋转结果,判断一个字符串是否可以由另一个字符串旋转得到

题目描述 写一个函数,判断一个字符串能否为另外一个字符串旋转之后的字符串 例如: 给定s1AABCD和s2BCDAA,返回1 给定s1abcd和s2ABCD,返回0 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一个字符等到DAABC 方法一(不断左旋&#xff…

积微成著,联想集团何以短期制胜?

“现在很多朋友说我们是站在悬崖边上,我说是,也许是站在悬崖边上,也许是联想一个重要的转折点。一年多以后,我估计就能够见分晓。如果我们掉到悬崖下面,我会找院长先生谈一谈我怎么掉下去了。如果我转折过来的话&#…

2011年软件收入百强名单 华为826亿居首

6月28日消息,工信部今天发布了2011年中国软件业务收入前百家企业名单,华为以827亿元的收入遥遥领先,中兴第二,为380.8亿元。 本届百家软件企业共实现软件业务收入3135.47亿元人民币,与上届百家企业收入总和2456.26亿元…

JVM调优总结(精品)

转自:http://pengjiaheng.javaeye.com/blog/518622 JVM调优总结-序 几年前写过一篇关于JVM调优的文章 , 前段时间拿出来看了看,又添加了一些东西。突然发现,基础真的很重要。学习的过程是一个由表及里,再由里及表的过程…

VB.Net Socket实现Http文件上传及下载类

GET访问: dim httpClient as new WebClient() httpClient.strUrl"http://www.baidu/com?wdhello" httpClient.Proc() Msgbox(httpClient.RespHtml)POST访问: dim httpClient as new WebClient() httpClient.strUrl"http://www.baidu/com…

Excel简单五子棋

为什么80%的码农都做不了架构师?>>> 闲来无事,用Excel做了简单五子棋,由于不会向前搜索的预测算法,实在是菜的很,消遣消遣啊,哈哈。 下载地址:http://download.csdn.net/source/157…