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