当我在Windows上创建共享内存段(例如CreateFileMapping(INVALID_HANDLE_VALUE, ...)
)时,除了创建更大的段并复制数据之外,是否有其他方法可以调整其大小?
我已经在MSDN中阅读到文件映射具有固定的大小,但是是否可以通过某种方法在相同的内存上进行新的映射?像在Linux中一样,您可以在其中使用shm_open()
,然后再次使用ftruncate()
和mmap()
。
最佳答案
简短的回答是“否”-创建文件映射后,您无法调整其大小。您所描述的创建/复制序列是我所知道的使用系统页面文件支持的文件映射来完成此操作的唯一方法。
也就是说,您可以自己管理支持映射的文件并完成此操作。从您自己的零初始化数据文件开始,并在对CreateFileMapping()
的调用中为其指定有效的句柄。
需要调整大小时,请关闭映射,扩展文件,然后重新创建映射。这将需要在增长/截断操作之间进行一些同步-并非微不足道,但也不应该太困难。
最后,这是一个古老的故事。增加了复杂性与性能。