SharpDevelop的作者们在实现有关SharpDevelop文本表示时,比较了3中文本的保存方法:
1.数组---很明显这种方法虽可以通过下标快速获取到想要的字符,但在插入和删除时其表现实在不过去,而我们写程序不可能一次性把程序写好,而是需要很多次的修改或是在文本中间进行编辑的。
2.链表---这种结构在插入或是删除时都可以很方便的实现,如在插入时只需为新文本在编辑缓冲区中指定一个新快,然后链接上即可,但此方法对内存的要求要高些;另外频繁的插入和删除将导致缓冲区越来越片段化,也将导致性能的下降;还有就是这种方法不能通过下标来快速访问。
3.间隙缓冲区---即在整个编辑缓冲区中开辟一块间隙,这是一种介于数组和链表之间的有效方法,间隙的大小由程序员根据经验来设定。
间隙是跟在编辑插入符的后面的,所以当插入符的位置改变时,间隙也会跟着移动,以确保在插入时总是插入在间隙中 。
假设编辑窗口中已有文本: Without ******love(其中的*即为缓冲区中的间隙,用户编辑时是没有的),
现在要在Without后面添加字符your,则只需用your替换****即可,而不需要移动数组内容,只有在要插入的字符串的长度超过了剩余的间隙的长度时才需要扩充间隙,从而移动缓冲区数组;同理在删除时当间隙的长度超过了最初设定的最大长度时就需要缩减间隙的长度。
这种方法其实就是减少了移动数组的次数,从而达到性能的提升的。
SharpDevelop中实现间隙缓冲区的代码主要如下: