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