是否可以在不复制数据的情况下扩展间隙缓冲区?
Is it possible to expand a gap buffer without copying data?
我正在阅读 this overview of some possible data structures for storing a sequence of characters for the purposes of a text editor. One popular and efficient way is the gap buffer。
当间隙缓冲区填满而不再有间隙时,需要将数据复制到更大缓冲区的开头和结尾以重新创建间隙以供进一步插入。但是,在概述的第 9 页上,它指出
with some help from the operating system, we can expand the gap without actually moving any data.
我还没想出办法做到这一点,所以我想知道是否真的可行。如果是这样,如何进行以及在哪些情况下进行。还是我误解了作者的意思?
在 Linux 中,您可以使用例如mremap() 移动虚拟地址中的数据 space.
至于Windows,你应该使用AllocateUserPhysicalPages(), MapUserPhysicalPages(), VirtualAlloc()左右的组合。
整个想法是,您不是复制数据,而是更改 how/where 物理内存(包含数据)出现在地址 space 中。如果您不熟悉相关概念,请阅读页面翻译和页表。
更新:严格来说,当间隙消失并且光标位置接近内存页的开头时,您可能仍然会复制一个页面大小的数据。但这在现代系统上几乎不会引起注意。你还没有复制所有其他页面中的数据。
我正在阅读 this overview of some possible data structures for storing a sequence of characters for the purposes of a text editor. One popular and efficient way is the gap buffer。
当间隙缓冲区填满而不再有间隙时,需要将数据复制到更大缓冲区的开头和结尾以重新创建间隙以供进一步插入。但是,在概述的第 9 页上,它指出
with some help from the operating system, we can expand the gap without actually moving any data.
我还没想出办法做到这一点,所以我想知道是否真的可行。如果是这样,如何进行以及在哪些情况下进行。还是我误解了作者的意思?
在 Linux 中,您可以使用例如mremap() 移动虚拟地址中的数据 space.
至于Windows,你应该使用AllocateUserPhysicalPages(), MapUserPhysicalPages(), VirtualAlloc()左右的组合。
整个想法是,您不是复制数据,而是更改 how/where 物理内存(包含数据)出现在地址 space 中。如果您不熟悉相关概念,请阅读页面翻译和页表。
更新:严格来说,当间隙消失并且光标位置接近内存页的开头时,您可能仍然会复制一个页面大小的数据。但这在现代系统上几乎不会引起注意。你还没有复制所有其他页面中的数据。