4_12_GLib库入门与实践_夸克

9 篇文章 0 订阅

简介

Quarks标识一对字符串和整数的关联关系。给定字符串或者给定整数,可以方便地获取另一个值。

数据结构

数据结构
typedef guint32 GQuark;

函数列表

#define 	G_DEFINE_QUARK()
GQuark 	g_quark_from_string ()
GQuark 	g_quark_from_static_string ()
const gchar * 	g_quark_to_string ()
GQuark 	g_quark_try_string ()
const gchar * 	g_intern_string ()
const gchar * 	g_intern_static_string ()

函数功能分类

创建
GQuark g_quark_from_string ()
GQuark g_quark_from_static_string ()

查找
const gchar * g_quark_to_string ()
GQuark g_quark_try_string ()

字符串驻留
const gchar * g_intern_string ()
const gchar * g_intern_static_string ()

函数功能说明及综合演示

创建

从字符串创建一个GQuark,可以使用下面两个函数:

g_quark_from_string()
g_quark_from_static_string()
  • g_quark_from_string在创建Quark映射时会对字符串进行拷贝,这样字符串即使被释放或销毁,对Quark本身不会有任何影响。
  • g_quark_from_static_string在创建Quark时不会对字符串进行拷贝,如果创建完Quark,释放了字符串,则会产生不可估料的问题。

字符串和夸克整数之间的关联内部实现原理是维护了一个全局hash表,给定一个字符串,若字符串在hash表不存在,则先计算出一个夸克对象(实际上是int类型的值),然后将字符串作为key,库克对象作为value,插入hash表。

查找

查找函数为:

g_quark_to_string()

根据GQuark返回对应的字符串。与普通hash查找不同,用GQuark查找对应字符串是通过数组下标引用来实现的。在创建一个GQuark映射时,字符串在作为key存入hash表、GQuark作为value存入hash时,
还将这一对映射关系存入了一个数组中,数组下标为GQuark,数组中存的值为字符串,这样在通过GQuark查找与之关联的字符串时,可直接将其作为数组下标以得到数组的值,效率非常高。

与上述通过GQuark查找字符串不同,下面这个函数实现的是通过字符串查找其对应的夸克,如果返回0,则说明字符串不在夸克中:

g_quark_try_string()

通过字符串查找与之相对应的GQuark,内部实现为hash查找,通过key查找value。与g_quark_to_string

字符串驻留

以下两个函数返回字符串的规范表示形式:

g_intern_string()
g_intern_static_string()

g_intern_string()相当于g_quark_from_string() + g_quark_to_string(),若字符串未存在全局Quark中,则插入,并返回该字符串在全局Quark中的地址,若字符串已存在,则返回该字符串在全局Quark中的地址。返回的字符串,可以通过比较指针是否相等来判断字符串是否相等,不再需要strcmp()函数比较,其原因是,字符串相同,其在全局Quark hash表中保存的位置也相同。
g_intern_static_string()函数与与g_intern_string()函数功能类似,但不会拷贝原始字符串,因此返回的字符串地址与原字符串地址相同。

夸克功能综合演示

下面是夸克功能的综合演示程序。
源码见glib_examplesglib_quarkglib_quark_basic

#include <glib.h>

static void g_quark_intern_string_test(void)
{
    gchar *str = "abcd";
    gchar *str1 = NULL;
    gchar *str2 = NULL;

    str1 = (gchar *)g_intern_string(str);
    str2 = (gchar *)g_intern_string(str);

    g_print("str(%p):%s, str1(%p):%s, str2(%p):%s 
", 
    str, str, str1, str1, str2, str2);
}

static void g_quark_intern_static_string_test(void)
{
    gchar *str = "xyz";
    gchar *str1 = NULL;
    gchar *str2 = NULL;

    str1 = (gchar *)g_intern_static_string(str);
    str2 = (gchar *)g_intern_static_string(str);

    g_print("str(%p):%s, str1(%p):%s, str2(%p):%s 
", 
    str, str, str1, str1, str2, str2);
}


gint main (gint argc, gchar** argv)
{
    g_quark_intern_string_test();
    g_quark_intern_static_string_test();

    return 0;
}

运行结果:

[root@centos7_6 build]# ./glib_quark_basic
str(0x400940):abcd, str1(0x7ec810):abcd, str2(0x7ec810):abcd
str(0x40096f):xyz, str1(0x40096f):xyz, str2(0x40096f):xyz

从运行结果可以看出:

  • g_intern_string在将字符串夸克化时,会将字符串复制一份,但相同内容的字符串也只会复制一次,不会再次复制。
  • 而g_intern_static_string在将字符串夸克化时,使用的还是字符串原来的内存,不会开辟新内存。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值