当我在大学时使用C++时,我被告知要尽可能使用多维数组(因此称为MDA),因为它分配给一个大块,因此具有更好的内存局部性。另一方面,阵列数组(AoA)被分配为多个较小的块,可能会分散在物理内存中发现空缺的所有位置。

所以我想第一个问题是:这是神话,还是值得遵循的建议?

假设是后者,那么下一个问题将是在没有真正MDA的Java之类的语言中做什么。当然,用1DA模拟MDA并不难。本质上,具有MDA的语言的语法糖可以实现为没有MDA的语言的库支持。

这值得付出努力吗?对于Java这样的语言,优化问题的级别是否太低?我们是否应该放弃数组,甚至对基元也使用List

另一个问题:在Java中,一次分配AoA(new int[M][N])可能会产生与分层分配(new int[M][]; for (... new int[N])不同的内存分配吗?

最佳答案

Java和C#以与C++完全不同的方式分配内存。实际上,在.NET中,如果将AoA的所有数组依次分配,则可以肯定它们会紧密靠近,因为内存只有一个连续的块,没有任何碎片。

但是对于C++来说仍然是正确的,并且如果您想要最大的速度仍然有意义。尽管您不必每次都想要多维数组时都遵循该建议,但是您应该首先编写可维护的代码,然后在速度较慢时对其进行概要分析,但过早的优化是这个世界上所有邪恶的根源。

10-01 05:51