当我在大学使用C++时,我被告知尽可能使用多维数组(以下简称MDA),因为它表现出更好的内存局部性,因为它是在一个大块中分配的。而另一方面,数组的数组(AoA)则是在多个较小的块中分配的,可能散布在物理内存中的任何空缺处。
所以我想第一个问题是:这是一个谬论,还是值得遵循的建议?
假设这是后者,那么接下来的问题就是,在像Java这样没有真正MDA的语言中该怎么办。当然,用1DA模拟MDA并不难。本质上,对于具有MDA的语言的语法糖可以作为对没有MDA的语言的库支持实现。
这是否值得付出努力?对于像Java这样的语言来说,这是否过于低级的优化问题?我们应该放弃数组,甚至对于基元类型也使用List吗?
另一个问题:在Java中,将AoA一次性分配(
所以我想第一个问题是:这是一个谬论,还是值得遵循的建议?
假设这是后者,那么接下来的问题就是,在像Java这样没有真正MDA的语言中该怎么办。当然,用1DA模拟MDA并不难。本质上,对于具有MDA的语言的语法糖可以作为对没有MDA的语言的库支持实现。
这是否值得付出努力?对于像Java这样的语言来说,这是否过于低级的优化问题?我们应该放弃数组,甚至对于基元类型也使用List吗?
另一个问题:在Java中,将AoA一次性分配(
new int[M][N]
)可能会产生与逐层分配(new int[M][]; for (... new int[N]
)不同的内存分配吗?