【问题标题】:C array of pointers vs. array of raw values: performance and memoryC 指针数组与原始值数组:性能和内存
【发布时间】:2012-03-20 22:15:18
【问题描述】:

我有一个 3D 游戏,其中对象存储在 3D 数组中。每个对象都是一个相对较大的struct(几兆字节,准确地说是 4,194,304 字节)。

如果我将它们存储为原始值数组:gameObject objects[64][64][8],它们都存储在一个地方,但每个对象都被分配,无论是否使用它。
但是,如果我将数组分配为指针数组:gameObject *objects[64][64][8],则在需要之前不会分配未使用的对象(可能超过整个数组的一半),从而减少内存影响,但可能会更慢,因为对象遍布内存

考虑到性能和内存使用之间的权衡,哪种方法最好?我的担忧有效吗?

【问题讨论】:

  • “几个字节”是多少?一个指针在 x86_64 上是 8 个字节,我认为这也是一些
  • 抱歉,刚刚意识到我在查看代码的错误部分;)。它更像是几个 百万 字节。
  • “考虑性能和内存使用之间的权衡”在您进行测量之前,您所做的任何事情都是无关紧要的。
  • 您将无法分配 200 万个对象,每个对象有 400 万字节的存储空间,因为它需要 8 TB 的 RAM。所以答案是:你需要通过动态分配来做到这一点。
  • 在开发软件时,有时能够估计四个数字的乘积是一个优势。对于您修改后的问题,您仍然需要 128 GB 的 RAM。可能在 iPhone 10 中。

标签: c arrays performance memory-management


【解决方案1】:

[第二种方法]可能会更慢,因为对象遍布内存

由于每个对象的大小为 4MB,因此跨不同对象的引用局部性几乎肯定不是问题。采用第二种方法。

如果您提供给我们的数字是正确的,那么完全填充的 128x128x128 4MB 对象数组将需要大约 8TB 的 RAM,这使得第一种方法在典型硬件上有些不可行。 ;-)

【讨论】:

  • 这不仅仅是参考位置;取消引用指针也有延迟成本。
【解决方案2】:

您更高效的选择是使用动态分配的数组,以便您可以将其调整为您拥有的确切元素数量,并将它们存储为值数组。除非它是稀疏的,在这种情况下我同意你应该使用间接。

【讨论】:

    【解决方案3】:

    在您评论说您只需要 500MB 的 RAM(您现在的问题是 128GB 的​​ RAM...)之后,可以比较这两个选项,因为两者都是可行的。

    除非您唯一要做的就是访问每个对象的前几个字节,否则动态分配它们真的不会丢失任何东西。您需要有非常不寻常的使用模式,第一种方法才能明显快于第二种方法。

    由于您是唯一知道如何访问这些对象的人,因此您可能应该衡量每个选项,看看第一个选项是否确实更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      相关资源
      最近更新 更多