天天看点

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语言原子接口与实现

继续阅读