天天看點

C語言原子接口與實作

 原子是一個指向唯一的、不可變的0個或任意多個位元組序列的指針,大多數原子都是指向以空字元結束的字元串,但是任何一個指向任意位元組序列的指針都可以使原子。任何原子隻能出現一次。如果兩個原子指向同一個記憶體單元時,則兩個原子是相等的。僅僅比較兩個位元組序列相應的指針是否相等,就可以判斷這兩個位元組序列是否相等了,這就是使用原子的好處之一;還有一個好處就是使用原子可以節省空間,因為每個序列隻會出現一次。

atom的接口很簡單:

C語言原子接口與實作

atom_new接收一個指向位元組序列的指針以及該序列的位元組數作為輸入,它在原子表中增加一個該序列的拷貝,并且如果需要的話,傳回原子表中指向該拷貝的指針(即原子)

原子總是以一個空字元結束,在必要的時候該空字元由atom_new添加

atom_string接收一個空字元串結束的字元串作為輸入,在原子表中增加一個該串的拷貝,如果需要的話傳回該原子

atom_int傳回長整數n的字元串表示的原子

atom_length傳回其原子參數的長度

atom的實作對原子表進行維護。atom_new,atom_string,atom_int查找原子表,并都有可能在原子表中添加一個新的元素,而atom_length僅僅查找原子表

atom_string,atom_int可以在不知道原子表細節的情況下執行相應的操作

atom_int首先把它的參數轉化為一個字元串,然後調用atom_new:

atom_int必須處理二進制補碼數的不對稱範圍以及c的除法和取餘運算的不确定性,無符号的除法和取餘都具有良好的定義,是以atom_int也可以通過使用無符号算術來避免使用有符号運算引起的不确定。

引入頭檔案和相關宏:

散清單顯然是一個針對原子表的資料結構,散清單是一個入口表的指針數組,其中每一個元素都存有一個原子:

針對“an atom”的struct atom的小尾數法布局:

C語言原子接口與實作

atom_new計算由str[0……len-1]給定序列的散列值,并用buckets的元素個數對其取模,搜尋由buckets中該散列值元素所指向的連結清單。如果發現str[0……len-1]已存在于表中,它将隻是簡單地傳回該原子:

hash表結構:

C語言原子接口與實作

atom的實作對原子表進行維護,atom_new、atom_string以及atom_int查找原子表,并且都有可能在原子表中添加一個新的元素,而atom_length僅僅查找原子表。

完整實作代碼如下:

C語言原子接口與實作

繼續閱讀