glib库中的GQuark介绍

为了在程序中标识一块数据,你一般有两种方式可选:数字或字符串。但是这两者都有一些缺点。数字是非常难以辨认的。如果你开始粗略的知道需要多少标签,你就可以定义一个枚举类型和一些字符符号。但是,你没法在运行的时候动态添加标签。

Gquark本质上还是哈希表存储字符串,一个数字对应一个字符串。

另一方面,你可以在运行的时候动态的添加或修改字符串,而且它们是很容易理解的。   但是,字符串比较要比数字比较花更长的时间,而且在内存中管理字符串有一些你可能不愿意处理的额外麻烦。

GLib 提供了 GQuark 类型,它整合了数字的简单和字符串的易用。在它内部,它就是一个易于比较和复制的整形数。 GLib 将这些数字映射为你的字符串,并且你可以在任何时间取得字符串所对应的值。

 

要创建一个 quark ,使用下面两个函数之一:

GQuark quark;

gchar *string;

quark = g_quark_from_string(string);

quark = g_quark_from_static_string("string");

这两个函数都是以字符串作为它们唯一的参数。它们的区别是 g_quark_from_string() 会在映射的时候创建一个字符串的拷贝,但是 g_quark_from_static_string() 并不会。

警告  小心使用 g_quark_from_static_string() 。在每次执行它的时候会节约很少的 CPU 和内存,但是,在你的程序中增加了附加的依赖性可能会导致你的程序有一些 bug ,所以,或许节约的那一点开销并不值得你去使用该函数。

 

如果你想检验某个字符串是否有一个 quark 值,调用:

g_quark_try_string(string)

这个函数的返回值是该字符串所对应的 quark 值。如果返回 0 的话,说明没有与这个字符串相对应的 quark值。

 

 quark 恢复到 string 使用:

string = g_quark_to_string(quark);

如果它执行成功,它将会返回 quark 对应的字符串的指针。但是你不能在这个指针上调用 free() ,因为这个字符串并不是一个拷贝。

下面是一个简短的示例代码:

GQuark *my_quark = 0;

my_quark = g_quark_from_string("Chevre");

if (!g_quark_try("Cottage Cheese"))

{

  g_print("There isn't any quark for \"Cottage Cheese\"\n");

}

g_print("my_quark is a representation of %s\n", g_quark_to_string(my_quark));

注意  GQuark 值是分配给字符串的数字,并且很容易测试它们的等同性。然而,它们并没有数字顺序。你不能用 quark 值来进行字母顺序测试。因此,你不能用它们作为排序关键字。如果你想比较 quark 所代表的字符串,你必须先用 g_quark_to_string() 来提取相应的字符串,然后才可以使用 strcmp()  g_ascii_strcasecmp() 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值