Windows: изменить размер общей памяти
Когда я создаю сегмент общей памяти в Windows (например, CreateFileMapping(INVALID_HANDLE_VALUE, ...)
), есть ли способ изменить его размер, кроме создания большего сегмента и копирования данных?
Я читал в MSDN, что сопоставления файлов имеют фиксированный размер, но есть ли какой-нибудь способ сделать новое сопоставление в той же памяти? Как в Linux, где вы можете использовать shm_open()
а потом ftruncate()
а также mmap()
это снова.
1 ответ
Краткий ответ - нет - вы не можете изменить размер сопоставления файла после его создания. Описанная вами последовательность создания / копирования - единственный способ сделать это с помощью сопоставлений файлов, подкрепленных файлом системного пейджинга.
Тем не менее, вы можете самостоятельно управлять файлом, поддерживающим ваше отображение, и выполнить это. Начните с собственного файла данных, инициализированного нулями, и укажите действительные дескрипторы к нему для ваших звонков CreateFileMapping()
,
Когда вам нужно изменить размер, закройте сопоставления, расширьте файл и заново создайте сопоставления. Это потребует некоторой синхронизации между операциями роста / усечения - не тривиально, но и не должно быть слишком сложным.
В конце концов, это та же самая старая история. Добавленная сложность против производительности.