指针太昂贵了

Pointers are too costly memory wise?

本文关键字:指针      更新时间:2023-10-16

我知道这是不合适的,但是我想得到如此的意见。

我正在建立一个模拟,其中对象必须相互交互。因此,在有序中也跟踪对象与对象相互作用的另一个对象,我正在向它们保留指针。但是就我而言,一个对象可能必须与其他约15000个对象进行交互,因此我最终必须将15 000个指针保留在每个对象的向量中。我想要至少10亿,希望更多这些对象能够正确模拟我的问题。

我正在考虑将对象存储在向量中,然后仅使用索引来引用对象。这样,我将只需要保持15,000 32位整数的矢量而不是存储15,000个64位指针。

这可能的一个缺点可能是性能会放缓,但是我愿意放弃更大规模的表现吗?

15 000是最大值,有时我只需要指向1000个对象。

这个问题有更好的解决方案吗?其他人在模拟等方面是否遇到了类似的问题,您做了什么?

在CPP中进行大规模模拟有什么好书/文章等吗?我还担心缓存,锁定和内存一致性等问题将如何达到我的表现。

感谢您在评论中的建议。我想在问题中提供有关地方的更多信息。

一个对象仅与其附近其他对象进行交互,而该附近是不同的部分。意思是,较大空间内有部分。如果对象在一个部分中,则只需与该部分中的其他对象进行交互。有一些对象在各节之间相互作用,但是我忽略了它们。

这似乎是我能给您的唯一相关信息。

一个对象仅与其附近其他对象进行交互,而该附近是不同的部分。[...]并且,如果一个对象在一个部分中,则只需与该部分中的其他对象进行交互。

如果部分中的每个对象都与同一部分中的所有其他对象进行交互,则可以跟踪您的对象所使用的部分。考虑到您没有太多的部分,您可以使用单个部分来做到这一点int每个对象。当您想知道两个对象是否必须进行交互时,请比较它们的部分编号。

另一种希望做的更好的方法可能需要您重新设计模拟。如果对象仅在各节内,则将这些部分拥有您的对象。这样,您就不需要每个对象的额外"截面号"。在考虑互动时,只需一次在一个部分内操作。

另外,正如VU1P3N0X在评论中所说的那样,您可能需要考虑使用Quadtrees(或类似的高维树)。这确实取决于您正在构建的模拟类型。

有一些跨部分相互作用的对象,但是我忽略了它们。

有几种表示跨部分相互作用的方法。

一种方法是使它们成为完全不同的数据。交互将由两个部分表示,在这些部分中,要么"边缘"对象列表,并且可以在各节中进行交互,要么根据您的模拟。/p>

另一种方法是,在每个部分中,要存储可以通过各节相互作用的不同对象,我们将其称为边界对象。假设每个部分都可以与其他四个部分进行交互(其中的对象可以互动)。然后,您将对象存储在五个不同的容器中:一个对象不能跨部分进行交互,让我们称它们为中心对象,而另一部分则将其称为"边框对象"。这四个后一个容器代表本节的边界。在部分的对象上迭代时,您首先像以前一样考虑中心对象。然后,对于每个边界,您考虑其边框对象以及相应部分中的边框对象。这假定给定部分中的任何对象都可以与同一部分或其他部分中的对象进行交互。

如果您没有存储的内存,则为每个对象,它与之交互的其他对象列表,那么保存内存的简单方法就是简单地 not not <<em>/em>在每次需要时存储列表,重新计算

或者,如果需要,请存储少量的信息,使您可以再生列表。

这假定您的问题实际上允许。


同样,您可以将部分数据保存到磁盘并根据需要进行重新加载。当然,这需要知道如何/o有效地知道。(除非您在移动下一部分之前对数据的每个部分进行计算的 lot

仿真太宽了,无法完全回答您的要求。

我能说的最好的事情是,总有一个:

速度和空间之间的权衡。

因此,通常会有更多的空间意味着更高的速度(您需要更多的空间来获得更快的执行,不是吗?)。


如果您使用32位的整数,而不是使用64位的指针,那么您将减少项目的空间要求。但是,当涉及速度时,您只能知道它是可以接受的还是表现迅速下降。

我建议您通过为您的编译器启用优化标志(用于G 中的审查-03)并测量执行时间来测试/配置代码。

如果执行时间与采用较少内存的方法的不同之处在于,那么我可能会选择比一个。但是在这里再次值得一提的是:

您应该确定哪些对应用,速度或空间至关重要!

它认为无需除非每个对象的向量都不同,否则请保留每个对象的指针向量。如果每个对象要与所有其他对象进行交互,则只需要保留一个参考的向量,然后在发生时跳过对象之间的相互作用。

我不会在内存中保留有关每个对象的相互作用的信息)。其中包括有关是否将完全进行互动的信息。

如果对象对他们过去的关系有记忆……我不知道,这是一个困难的问题。在这种情况下,您可能很幸运,每个对象的"令人难忘的关系"集很小,否则...

很难!