【问题标题】:How to keep a static array out of memory until first used如何在第一次使用之前将静态数组保持在内存之外
【发布时间】:2014-09-24 04:21:15
【问题描述】:

我对 C++ 很陌生,所以我对静态数组的工作方式有些困惑。我知道在 C# 中,数组在第一次访问之前不会放入内存中,如果您希望它可以立即访问,这可能会出现问题。但是,我正在努力将 Perlin 类转换为 C++,并且我希望拥有多个静态数组,其中只有一个可以在运行时使用或任意数量。实际上,内存问题并没有那么大,因为它们都不会超过 50kb,但是,除非我要求,否则我宁愿知道是否可以确保数组不加载到内存中。有没有办法确保源代码中定义的静态数组不会加载到内存中,除非被要求?这是一件非常挑剔的事情(尤其是 x64),但我希望尽可能对其进行优化。我讨厌用不会被使用的东西占用内存的想法。

或者也许静态数组甚至不是要走的路 - 只是动态类对象包装的数组?

我想真正的问题是:在 C++ 中实现表查找的最有效解决方案是什么?

【问题讨论】:

  • 如果您将数组设为const 数组(带有任何子对象const),那么它们可以存在于代码区域中,即它们不需要任何额外的内存分配。可执行文件的代码区将映射到进程的虚拟地址空间,可以直接从中读取内容。
  • 所以静态 const 数组比静态更快?对我来说,编译的程序是魔法巫术的东西(即我不太了解底层编译结构)。程序的编译代码在程序执行时完全加载到内存中?没有磁盘访问?
  • 它取决于系统。我只知道我熟悉的那些细节(不是 x86 类型系统!)

标签: c++ arrays pointers memory-management static


【解决方案1】:

静态数组将在您的内存空间中,无法忽略或释放它们,但这与“在内存中”不同。将其留给 Windows 虚拟内存管理器。当您第一次访问阵列时,Windows 会将其从磁盘放入 RAM。

【讨论】:

  • 我想我应该使用“RAM”这个词 - 但是 - 是的,这是我的一般问题。我可能会接受另一个人的答案,因为他通过运行时打包文件中的数组提供了一个替代方案,我认为这应该比其他正确答案“更容易接受”。谢谢。
【解决方案2】:

不,您不能这样做:C++ 中静态初始化的结构和数组与您的其余代码一起加载到内存中,因此您无法影响加载的时间。

如果您必须在运行时加载静态数组,请考虑更改策略以将数据放入单独的文件中,并添加初始化函数以将文件读入静态vector 对象。此策略导致将数据放入动态内存区域,而vector 对象本身可以保留static

【讨论】:

  • 50KB 的地址空间没什么好担心的。这比 128x128 位图小。它只是地址空间,甚至不是内存。
  • 我知道——但现在我知道如果我想查找“maxint”表,我应该从文件中加载它。 (这也是我第一次编写 x64 代码,所以我习惯于更关心额外的内存)。我可能有很多这样的静态数组,它们为不同的噪声效果选择了不同的梯度向量,因此我想知道内存是如何更详细地工作的。
【解决方案3】:

Windows 和 Linux 都使用“按需加载”,这意味着代码和数据在到达它的代码实际需要数据时才被加载。所以假设数据是常量和全局的(例如static const int x[number] = { ... }),数据将不会被加载。 [这个的典型粒度是 4KB 或者它的某个倍数,但是如果你有数百个 50KB 的数据块没有被使用,你不应该在内存中看到它们,因此加载程序本身不会有延迟]。

与往常一样,在性能和优化方面,最好不要通过尝试预测某个领域的问题(也称为“过早的优化”)而使事情变得过于复杂,并确保您认为可能存在的问题实际上是一个问题在优化之前。

【讨论】:

  • 每个额外不必要的处理步骤都是噪声生成器中的一个“问题”——但我理解你的一般意思——但我不同意你对可能拉动算法的“不要过度思考优化”每秒百万或更多的样本。如果 C++ 以某种我不太了解的方式表现,我只是不想过于专注于特定的算法结构。我从 C# 开始只写了一个月。
  • 是的,但是添加额外的代码来处理实际上可能不是问题的问题肯定会减慢速度。所以不要这样做,除非你知道你必须这样做。
  • 不添加新代码 - 寻找减少算法中的步骤和缓慢操作的方法我需要在确保速度的同时保持多功能性。查找表对于快速 Perlin 算法是必需的,只是知道如何最有效地实现它们。不过,我绝对理解您在说什么,并且有时会放慢速度以加快速度,但是我已经了解了在尝试优化时优化和使事情变得更糟之间的区别。虽然我确实倾向于编写非常“通用”的类,这会导致更慢但更便携的操作。
  • 我讨厌重写以专有方式设计的用于其他用途的类对象,因此我想方设法保持我的意见可移植性。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
相关资源
最近更新 更多