我正在阅读一些可能的数据结构的this overview,用于存储文本编辑器的字符序列。一种流行而有效的方式是gap buffer。
当间隙缓冲区填满以便不再存在间隙时,需要将数据复制到较大缓冲区的开头和结尾,以重新创建间隙以便进一步插入。但是,在概述的第9页,它说明了这一点
在操作系统的帮助下,我们可以在不实际移动任何数据的情况下扩大差距。
我无法找到办法做到这一点,所以我想知道是否真的有可能。如果是这样,它是如何完成的以及在哪些情况下。或者我误解了作者的意思?
在Linux中,您可以使用例如mremap()在虚拟地址空间中移动数据。
至于Windows,你应该使用AllocateUserPhysicalPages(),MapUserPhysicalPages(),VirtualAlloc()及其附近的组合。
整个想法是,不是复制数据,而是改变物理内存(带数据)出现在地址空间中的方式/位置。如果您不熟悉相关概念,请阅读页面翻译和页面表。
更新:严格来说,当间隙消失且光标位置靠近内存页面的开头时,您可能仍然最终复制到页面大小的数据。但这在现代系统中应该难以察觉。您仍然不会复制所有其他页面中的数据。