菜鸟教程小白 发表于 2022-12-12 19:12:02

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


                                            <p><p>我正在尝试将二进制媒体资源嵌入到源代码中。我将使用纯 C 数组 (<code>char[]</code>) 来存储二进制文件。 (像这样:<a href="https://stackoverflow.com/questions/2627004/embedding-binary-blobs-using-gcc-mingw" rel="noreferrer noopener nofollow">Embedding binary blobs using gcc mingw</a> )因为单独管理媒体文件资源是非常烦人的工作,因为在编译时很难确定符号,并且让我的客户也很烦。</p>

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

<ol>
<li>这是代码的一部分</li>
<li>而且它是恒定的。</li>
</ol>

<p>我不知道有什么办法可以将它从内存中删除。</p>

<p>我如何<strong>让 C 数组始终直接从磁盘访问</strong>,而不是留在内存中?</p>

<p>PS。
我可以严格限制我的构建和执行环境。我将使用 Clang,该程序将在 iOS 上运行。无论如何我不介意使用任何额外的构建工具:)</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我不完全理解您在说什么或试图解决什么,但听起来您正在寻找内存映射。请参阅 <code>man mmap</code>。</p>

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

<p><strong>更新以进一步解释</strong></p>

<p>在您的 Mac 上,在终端中运行</p>

<pre><code>$ vmmap -resident $$
</code></pre>

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

<pre><code>==== Non-writable regions for process 7139
__TEXT 0100000000-00100099000 r-x/rwx SM=COW/bin/bash
</code></pre>

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

<p><strong>所以</strong>如果选择的操作系统 (iOS) 具有健全的内存管理,那么您的问题并不存在。只是不要碰你不需要使用的内存;每次触摸它,页面都会在内存中读取。</p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - 如何让 C 数组始终直接从磁盘访问而不是留在内存中?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/9105820/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/9105820/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - 如何让 C 数组始终直接从磁盘访问而不是留在内存中?