glib 惡夢終結者

2021-08-31 16:03:54 字數 3250 閱讀 4767

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

gnome

是基於gtk+

開發的一套桌面環境,gnome

和kde

作為兩大最流行的桌面環境,在全世界廣泛使用。只要是在linux

下工作的開發人員,對於gtk+

一定不陌生。而對於glib

,這個gtk+

下的無名英雄,其功能強大卻鮮為人知。今天,在這裡簡要介紹一下,如果你是開發人員,看完本文,相信你會愛上它的。

glib

不是gllibc

,儘管兩者都是基於(l)gpl

的開源軟體。但這一字之差卻誤之千里,glibc

是gnu

實現的一套標準c

的庫函式,而glib

是gtk+

的一套函式庫。在linux

平台上,像其它任何軟體一樣,glib

依賴於glibc。

glib

不是乙個學院派的東西,也不是憑空想出來的,完全是在開發gtk+

的過程中,慢慢總結和完善的結果。如果你是乙個工作3

年以上的c

,你會發現,很多苦惱已不再成其為苦惱,glib

裡很多東西正是你期望已經久的。

gobject

是glib

的精粹,glib

是用c實現的,但在很大程式是基於物件導向思想設計的,gobject

是所有類的基類。signal

在其中也是一大特色,signal

與作業系統中的signal

並不一樣,它是類似訊息一樣的東西,讓訊息在各個物件間傳遞,但盡量降低物件間的耦合。仔細讀一下它的**,唯一想說的話就是「絕!」。

動態陣列、鍊錶、雜湊表等通用容器,在不同的公司,在不同的時期,在不同的情況下,我們每個人對每一種容器,可能都實現過n

次以上。甚至在同乙個專案裡,出現幾份鍊錶的實現,也並非罕見。一直在抱怨,標準c

中為什麼沒有類似於stl

的標準容器,讓全世界的程式設計師在數以萬次的重複實現它們。不過,還算走運,有了glib

,惡夢在此終結了。glib

提供了動態陣列、單/

雙向鍊錶、雜湊表、多叉樹、平衡二叉樹、字串等常用容器,完全是物件導向設計的,實現得非常精緻。不用白不用,別客氣了。

你開發過跨硬體平台的軟體嗎?是不是常常為硬體平台的差異而苦惱呢?位元組順序是常見的問題之一,大端格式,小端格式,還是pdp

格式的?這樣差異造成的bug

會浪費不少時間,同時讓**晦澀難讀。glib

提供了一套完整的巨集,利用這些巨集編寫程式,問題大大簡化了。

你開發過跨作業系統的軟體嗎?在不同的平台下,很多函式有相同的功能,但函式原型,返回值差異巨大,也有的貌合神離,相同的名稱有著不同的意義,請看下面這張清單:

動態庫載入函式

執行緒函式

訊號量函式

互斥鎖函式

事件函式

字符集轉換函式

原子操作函式

建立程序函式

時間格式

io函式

為完成相同的功能,你卻要為此寫出不同的**。那怕只是乙個簡單的封裝,這麼多,你煩不煩?用glib

吧,它的作者們都是高手中的高手,對不同的平台的理解程度,遠遠超出你和我,而且這些程式經過大量的應用程式測試,已經非常的穩定了,放心的用吧。

你寫過讀取配置檔案的模組吧,像讀取ini

這樣簡單格式的檔案,當然不在話下,要讀markup

語言格式的配置檔案,難度可能大了點,雖然不是不可能,但除非是為了學習,何必自己找麻煩呢。glib

裡提供了詞法分析、markup

語言解析、ini

檔案訪問等功能,你完全不用為此擔憂。

不管是命令列程式,還是gui

程式,或者後台服務程序,通過命令引數來控制程式的行為,都是開發人員慣用的手法。從命令列引數取到有用的資訊,不難,遍歷一遍不就行了嗎?但在每個程式中都來遍一次,你不覺得很單調嗎?我們的時間很寶貴,浪費時間做這種事情,不值得吧。glib

的作者們早考慮到了,它提供了這樣的功能,你呼叫的它的函式,可能輕鬆的取得所要的命令列引數。

對於正規表示式,win32

下的開發人員可能用得少一點,而在linux

下的shell

裡,它卻是不可或缺之物。有沒有想到在自己的程式中使用的它呢,在有的情況下,使用正規表示式,可能會大大降低開發的難度,提高易用性。glib

也想到了這一點,它提供了簡單的正規表示式功能,當然,用與不用完全取決於你自己。

在程式裡,如果程式出錯了,特別是調了不該呼叫的函式,你是不是很想知道是誰調了它?大多數時候用debuger

是最好的選擇,在某些情況下,沒有debuger

可用,或者在debuger

裡重現不了這個問題,你會不會覺得很無助?別怕,glib

提供了一套跨平台的backtrace

函式,有了它,你可以很容易找到元凶了。

如果讀過一些大型的開源專案,你會發現,差不多每個專案都有一套自己的log

函式,用於記錄程式執行的除錯或者審計資訊。也有可能,你自己都曾在不同的專案裡實現過好幾次這個功能,第一次實現會覺得很好玩,會學到了一些東西,後來就會發現自己在做無用功。重複就是浪費,重複就是犯罪,glib

想到了這一點,它實現了一套完整的log

產生質數的演算法不難,在我們的程式裡也像是星外來客,很少使用,常常忽略了它。所謂書到用時方恨少,有這樣的東東,說不定就有用得到它的時候。glib

提供了這樣的功能,同時還提供了乙個較好的隨機數演算法。

linux shell

裡的自動補完功能很好用吧,從linux

轉移到win32

下工作的開發人員,常常抱怨win32

的shell

裡沒有這個功能,其實win32

下也是有的,把登錄檔裡的乙個選項開啟就行了。不管怎麼樣,總之這個功能太有用了,沒有它,你都會覺得少了點什麼,全身不自在,glib

裡連這個功能都提供了,是不是很人性化呢?

記憶體問題!還是記憶體問題!如果你沒有為記憶體問題而苦惱過,我都懷疑你是不是乙個真正的c

語言程式設計師。記憶體洩露、訪問越界、空指標、野指標和記憶體優化等問題,是不是都曾讓你夜不能昧?有些工具可以幫助你,但這不是萬能的良藥,好好寫你的程式才是第一要義。glib

提供了一些的手段,也可以在一定程度上減輕你的痛苦。

給我老師的人工智慧教程打call!

glib 惡夢終結者

g nome是基於gtk 開發的一套桌面環境,gnome和kde作為兩大最流行的桌面環境,在全世界廣泛使用。只要是在linux下工作的開發人員,對於gtk 一定不陌生。而對於glib,這個gtk 下的無名英雄,其功能強大卻鮮為人知。今天,在這裡簡要介紹一下,如果你是開發人員,看完本文,相信你會愛上它...

序列終結者

時間限制 1 sec 記憶體限制 128 mb 題目描述 給定乙個長度為n的序列,每個序列的元素是乙個整數。要支援以下三種操作 1.將 l,r 這個區間內的所有數加上v。2.將 l,r 這個區間翻轉,比如1 2 3 4變成4 3 2 1。3.求 l,r 這個區間中的最大值。最開始所有元素都是0。輸入...

序列終結者 Splay

1.注意在 split 和 merge 時要特判一下邊界,否則就會出現邊界錯誤的情況。2.隨時都要維護父指標。3.在更新 maxv 和翻轉標記時要判一下左右兒子是否都存在。include include includeusing namespace std const int maxn 100000...