objective-c - 如何让C数组始终直接从磁盘访问而不是保留在内存中?

标签 objective-c c ios arrays memory

我正在尝试将二进制媒体资源嵌入到源代码中。我将使用纯 C 数组 (char[]) 来存储二进制文件。 (像这样: Embedding binary blobs using gcc mingw )因为单独管理媒体文件资源是非常烦人的工作,因为在编译时很难确定符号,这也让我的客户很烦人。

无论如何,我担心的是内存消耗。实际上,如果我存储 PNG 图像,则在从中加载实时图像实例 (UIImage*) 后,我不再需要持久二进制文件。但我认为持久二进制文件将保留在内存中,因为

  1. 它是代码的一部分
  2. 而且它是恒定的。

我不知道有什么选项可以将其从内存中删除。

如何让 C 数组始终直接从磁盘访问而不是保留在内存中?

PS。 我可以严格限制我的构建和执行环境。我将使用 Clang,该程序将在 iOS 上运行。无论如何,我不介意使用任何额外的构建工具:)

最佳答案

我不完全理解你在说什么或试图解决什么问题,但听起来你正在寻找内存映射。请参阅 man mmap

ps 再次阅读,如果我正确理解你的问题,你想要制作一个包含所有资源数据的胖二进制文件。在这种情况下,操作系统可能会调出其中未使用的部分,因此内存会自动“释放”。 (“释放”是指释放可用于其他目的的物理内存)因此,持久二进制文件保留在虚拟内存中,但保留在物理内存中。

更新以进一步解释

在 Mac 上的终端中运行

$ vmmap -resident $$

这将显示 shell 的虚拟内存映射,显示总内存和常驻内存。您将看到这一行:

==== Non-writable regions for process 7139
__TEXT 0100000000-00100099000 [  612K   460K] r-x/rwx SM=COW  /bin/bash

这表示,在该内存区域中将找到文件 /bin/bash(内存映射,再次参见 man mmap),并且它是未完全调入;内存中实际上只存在 460kb 的二进制文件。这很有趣,因为这是实际运行的二进制文件。其他几行也很有趣,但超出了这个问题的范围。

所以如果选择的操作系统(iOS)具有健全的内存管理,那么您的问题并不真正存在。只是不要碰不需要使用的内存;每次您触摸它时,页面都会被读取到内存中。

关于objective-c - 如何让C数组始终直接从磁盘访问而不是保留在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105820/

相关文章:

c++ - 如何制作一个动态大小的数组?动态数组的一般用法(也可能是指针)?

c - 提高 C 循环的效率

iphone - 在 iPhone 上检索当前本地时间?

iOS、Swift、UIImagePicker 允许编辑裁剪工具移除透明度。有修吗?

ios - 在 BarButtonItem Swift 上添加角标(Badge)计数图标

c# - 使用 protobuf 将类型 System.Drawing.Rectangle 从 .Net 序列化为 C++

c - 在 C99 中指向数组开始之前的元素

objective-c - 如何为重复的目标创建 prefix.pch 文件

javascript - 在 NativeScript 中从 cocoapods 调用方法

objective-c - 在 obj-c 中设置文件的组和所有者