当前位置: 首页 > 面试题库 >

数组数组与多维数组的性能比较

轩辕越泽
2023-03-14
问题内容

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

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

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

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

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


问题答案:

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

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



 类似资料:
  • 问题内容: 例如: 一个) 与 b) 最初以为我会为了简化而选择a)。 我知道Java不会像C那样在内存中线性存储数组,但是这对我的程序有什么影响? 问题答案: 通常,在搜索答案时,最好的办法是查看如何将选择编译到JVM字节码中: 这被翻译成: 因此,如您所见,JVM已经知道我们在谈论多维数组。 进一步说明: 这被转换为(跳过循环): 因此,如您所见,多维数组在VM内部进行处理,无用指令不会产生开

  • 问题内容: 如何比较php中的多维数组?有没有简单的方法? 问题答案: 我知道的最简单的方法是: 请注意,您也可以使用。它们之间的区别是: 使用 Double equals时 ,顺序很重要: 对于 Triple equals ,类型很重要:

  • MATLAB中的多元数组MATLAB是下标多于两个的数组。可以调用带有两个以上变元的zeros, ones, rand, 或randn函数来产生。例如, R = randn(3,4,5); 生成一个3*4*5的数组,共有3x4x5 = 60个正态分布的随机元素。 三维数组可能表示三维物理数据,譬如房间的温度,取样于一个长方形网格。或者,可表示一个矩阵序列A(k),或依赖时间变化的矩阵A(t)。在

  • 问题内容: 我具有以下列数据的关联数组: 我需要将结构转置/旋转为行数组(将合并的列数据分配给它们各自的行)。我不需要结果中的列名。 预期产量: 问题答案: 正如Kris Roofe在删除的答案中所说,的确是一种更为优雅的方法。只要确保将其放入某种循环中即可,就像Sahil Gulati向您展示的那样。例如,像这样: 的输出正是您要寻找的

  • 7. 指向数组的指针与多维数组 指针可以指向复合类型,上一节讲了指向指针的指针,这一节学习指向数组的指针。以下定义一个指向数组的指针,该数组有10个int元素: int (*a)[10]; 和上一节指针数组的定义int *a[10];相比,仅仅多了一个()括号。如何记住和区分这两种定义呢?我们可以认为[]比*有更高的优先级,如果a先和*结合则表示a是一个指针,如果a先和[]结合则表示a是一个数组。

  • 问题内容: 我正在开发一个使用数据库类查询mySQL的php应用程序。 该类在这里:http : //net.tutsplus.com/tutorials/php/real-world-oop-with-php-and- mysql/ 我根据自己的需要对课程进行了一些调整,但存在一个问题(可能是一个愚蠢的问题) 使用select()时,它返回一个多维数组,类似于具有3个cols(id,firstn