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