Я хотел бы зарезервировать область памяти, а затем картографировать файлы в зарезервированную память. Между сопоставлением файлов могут возникать большие промежутки времени, в течение которых другие функции могут выделять память из кучи. После сопоставления файл может не отображаться и сопоставляться с новой ячейкой памяти.Как зарезервировать память на Windows и более поздние файлы карты?
В Linux это будет что-то вроде:
#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <cerrno>
int main(){
void *memory = mmap(nullptr, getpagesize() * 2,
PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE, -1, 0); // reserve memory
int handle1 = ::open("1", O_CREAT | O_RDWR, S_IRWXU); // open file1
int handle2 = ::open("2", O_CREAT | O_RDWR, S_IRWXU); // open file2
void *data = mmap(memory, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_FIXED, handle1, 0); // map first file into reserved memory
void *data2 = mmap(static_cast<char *>(memory) + getpagesize(), getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, handle2, 0); // map second file into reserved memory
}
В Windows, однако я не могу найти правильный способ сделать это. Кто-нибудь знает, как это делается?
Редактировать: Поскольку моя цель, похоже, не так проста для понимания. Еще раз упрощен:
Я хотел бы иметь память, отображаемую в памяти. Когда заполненная память заполнена данными, я хотел бы отобразить новый файл в память непосредственно после уже сопоставленной памяти, чтобы расширить отображаемую память (не оставляя промежутка между двумя областями, отображаемыми в памяти).
При более позднем запуске программы файлы могут использоваться для восстановления всех данных предыдущего запуска.
Проблема с решением с разреженными файлами и расширением существующего файла: Программа должна иметь возможность удалять файлы, если они больше не нужны. Поэтому важно, чтобы отображения всегда были новыми файлами.
Вы можете подумать об этом скорее как распределитель. Требуется память с отображением памяти. Библиотека отображает блок памяти и возвращает указатель на субблок. Память больше не нужна, она возвращается в распределитель. Если полное сопоставление больше не требуется, связанный файл будет удален (данные не должны быть записаны путем сопоставления, если он больше не нужен).
google "отображенный файл с памятью окон" –
Его не касается сопоставления файла, это просто. Его о сопоставлении файла в память, который ранее был зарезервирован, поэтому я могу сопоставить разные файлы в смежную память. – johnST
@johnST - на окнах это невозможно - если вы попробуете файл карты в зарезервированную память, вы получили сообщение об ошибке 'STATUS_CONFLICTING_ADDRESSES' – RbMm