我对mmap()
如何使用iOS或OSX上的框架感到困惑。
如果使用mmap()
将文件映射到虚拟内存并从中请求数据,则将数据中的内核页面映射到RAM。这实际上如何影响创建对象的方式?
如果通常使用alloc
/ init
创建对象,则分配内存块并启动对象。但是,如果数据驻留在mmap
'ed文件中的虚拟内存中会怎样?是否需要在对象上调用alloc
?对象的已分配内存是否充满了来自虚拟内存的数据?或者是否跳过alloc
调用并将指针传递给虚拟内存中的数据?
e.g。图像或声音文件,如果我知道文件在虚拟内存中的位置,我将如何设置对象?
如果有人分配数据,如果数据已经被分页到RAM中,它是否会重复?
我在想从虚拟地址中使用内存会消除在堆上分配的需要。
答案 0 :(得分:1)
如果您只有一个对象存储在mmaped空间中,那么您只需跳过alloc并直接使用该位置。但是,通常您将拥有多个对象,现在您自己管理它。通常,它的至少一部分将以固定的方式布局,以便两个过程都知道在哪里找到东西。而不是指针,你可以从竞技场的开始使用偏移,因为它可以在两个进程的地址空间中工作。
从本质上讲,你会得到一大块内存,好像你已经完成了一个大的malloc / alloc,你可以在其中玩游戏。
如果有,请说
void *p = mmap( <appropriate arguments> );
并且你想把一个foo类型的对象放在偏移量200处,你会说
foo *f = (foo *)p+200;
现在你可以以所有正常方式操作f,但不包含任何指向mmapped空间的指针。将偏移替换为这样的指针通常是好的规则,然后当你需要跟随它时,你可以将它转换为指针(通过添加p)。