是否可以在不复制数据的情况下扩展间隙缓冲区?

问题描述 投票:1回答:1

我正在阅读一些可能的数据结构的this overview,用于存储文本编辑器的字符序列。一种流行而有效的方式是gap buffer

当间隙缓冲区填满以便不再存在间隙时,需要将数据复制到较大缓冲区的开头和结尾,以重新创建间隙以便进一步插入。但是,在概述的第9页,它说明了这一点

在操作系统的帮助下,我们可以在不实际移动任何数据的情况下扩大差距。

我无法找到办法做到这一点,所以我想知道是否真的有可能。如果是这样,它是如何完成的以及在哪些情况下。或者我误解了作者的意思?

text memory-management data-structures virtual-address-space page-tables
1个回答
0
投票

在Linux中,您可以使用例如mremap()在虚拟地址空间中移动数据。

至于Windows,你应该使用AllocateUserPhysicalPages()MapUserPhysicalPages()VirtualAlloc()及其附近的组合。

整个想法是,不是复制数据,而是改变物理内存(带数据)出现在地址空间中的方式/位置。如果您不熟悉相关概念,请阅读页面翻译和页面表。

更新:严格来说,当间隙消失且光标位置靠近内存页面的开头时,您可能仍然最终复制到页面大小的数据。但这在现代系统中应该难以察觉。您仍然不会复制所有其他页面中的数据。

© www.soinside.com 2019 - 2024. All rights reserved.