gpt4 book ai didi

objective-c - mmap 数据如何与对象分配一起使用?

转载 作者:搜寻专家 更新时间:2023-10-30 20:26:09 24 4
gpt4 key购买 nike

我对 mmap() 如何与 iOS 或 OSX 上的框架一起工作感到有点困惑。

如果使用 mmap() 将文件映射到虚拟内存并从中请求数据,内核会将数据分页到 RAM。这实际上如何影响创建对象的方式?

如果通常使用alloc/init 创建对象,则会分配内存块并启动对象。但是,如果数据驻留在虚拟内存中,在 mmap 的文件中怎么办?是否需要在对象上调用 alloc?为对象分配的内存是否被虚拟内存中的数据填充?还是跳过 alloc 调用,只传递指向虚拟内存中数据的指针?

例如图像或声音文件,如果我知道文件在虚拟内存中的位置,我将如何设置对象?

如果分配数据,如果数据已经分页到 RAM 中,它不会重复吗?

我在想,使用来自虚拟地址的内存将消除在堆上分配的需要。

最佳答案

如果您只有一个对象存储在映射空间中,那么您只需跳过分配并直接使用该位置。然而,通常您会有多个对象,而现在您要自己管理它。通常,它的至少一部分将以固定方式进行布局,以便两个进程都知道在哪里可以找到东西。使用从竞技场开始的偏移量代替指针,因为这适用于两个进程的地址空间。

本质上,您获得了一大块内存,就好像您完成了一个大的 malloc/alloc,然后您可以在其中玩耍。

如果你有,说

void *p = mmap( <appropriate arguments> );

并且你想在偏移量 200 处放置一个 foo 类型的对象,你会说

foo *f = (foo *)p+200;

现在您可以以所有正常方式操作 f,前提是 f 不包含任何指向映射空间的指针。用偏移量代替此类指针通常是一种很好的纪律,然后当您需要跟随一个偏移量时,可以将其转换为指针(通过添加 p)。

关于objective-c - mmap 数据如何与对象分配一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10015658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com