Glib中Gquark淺析

Glib中Gquark淺析

夸克,英文名叫quark,原意是表示一種物理單位;第一次在GLIB中看到這個名詞,很有意思。

下文摘自http://blog.csdn.net/ciahi

爲了在程序中標識一塊數據,你一般有兩種方式可選:數字或字符串。但是這兩者都有一些缺點。數字是非常難以辨認的。如果你開始粗略的知道需要多少標籤,你就可以定義一個枚舉類型和一些字符符號。但是,你沒法在運行的時候動態添加標籤。

另一方面,你可以在運行的時候動態的添加或修改字符串,而且它們是很容易理解的。 但是,字符串比較要比數字比較花更長的時間,而且在內存中管理字符串有一些你可能不願意處理的額外麻煩。

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()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章