Nebula中的StringAtom

来源:互联网 发布:万达 知乎 编辑:程序博客网 时间:2024/06/06 14:06

N3中很多类的Name都用StringAtom类型的字符。StringAtom类中只有一个成员变量Content,其实就是一个const char *类型的指针,指向一个字符串。StringAtom类之间比较只需要进行指针间地址比较即可,两个content相同的StringAtom必定是表示相同的字符串。而StringAtom的大小也可以简单的比较地址的大小,速度比通常用字符串比较要快的多。

StringAtom类型的变量代表一个特定的字符串,而这个字符串在整个程序空间中只保存一份,只有初始赋值的需要几个比较操作及分配内存动作,以后的各种操作因为都不需要重新分配空间。StringAtom对象之间的比较赋值等速度都非常快,但是StringAtom与String或const Char *等类型的变量之间作比较或转化时速度会很慢。

 

StringAtom类的实现原理如下:

 

每个StringAtom类都包含一个Content变量,指向它所包含的字符串地址。

一个新的StringAtom被初始化或赋值时,如果右操作数也是个StringAtom对象,直接将Content的值赋值即可,否则的话必须到全局的字符串表中去查找是否存在这个字符串,如果存在的话返回地址,否则的话新分配一块地址,并返回该地址。

系统中有两个StringAtom缓冲表,真正的字符串内存存放在全局的StringAtom表中的StringBuffer对象中,而本地线程的StringAtom只作为一个缓冲区,保存了本地线程用到的一些字符串指针,因为每次访问Global StringTable的时候都需要Lock一下,会影响速度,所以本地线程保存了一个Local StringTable。

原创粉丝点击