一维数组和二维数组(矩阵)之间有效率差异吗?

时间:2019-04-25 12:53:27

标签: c arrays multithreading multidimensional-array

我目前正在为大学开发用C语言开发的游戏板。老师提供了一些代码,他将板子存储在内存中的方式是一维数组,板子有16个元素(4x4板子),第0行位于位置[0,3],第2行位于位置[ 4,7] ..等。他还使用下面的函数将二维坐标(i,j)转换为一维坐标,以便正确访问右侧板位置(以下函数)。该板将由多个线程管理,也许这将有助于多线程同步? 我的问题是:将电路板存储在具有4行4列的二维数组中(矩阵)会降低效率吗?

int linearConv(int i, int j){
  return j*dim+i;
}
char* getBoardPlaceStr(int i, int j){
  return board[linearConv(i, j)].v;
}

PS:而且,是否正在访问数组[0]之类的错误,取消引用指针(即* pointer),访问不需要关键区域的struct成员(即struct.member或sutuct-> member)原子操作?

3 个答案:

答案 0 :(得分:5)

  

以4行4列的二维阵列(矩阵)存储板效率较低吗?

两者:

T board[4][4];

并且:

T board[4 * 4];

具有相同的大小,对齐方式和布局。通常,任何维数组中的元素都连续存储而没有任何间隙(否则指针算法将不起作用)。

使用[j][i][j * 4 + i]访问元素在汇编中进行相同的计算。

换句话说,这两者之间没有性能或空间上的差异。

答案 1 :(得分:3)

数组中的元素在内存中彼此相邻,具有任意维度。

但是,直接访问这些元素的访问权限对效率有很大影响,例如出于缓存目的。

在计算机科学中,存在一种称为局部性原理的东西。无论是空间还是时间。

关于数组,我们得到了空间的局部性,它表示访问arr[1][1]处的元素也会可能也会导致访问元素arr[1][2]的情况。

查看this answer,了解如何访问数组(行/列)如何影响效率。

答案 2 :(得分:2)

  

此板将由多个线程管理,也许这会有所帮助   有多线程同步?

我认为没有理由期待。

  

我的问题是:它少吗   可以将电路板有效地存储在二维阵列(矩阵)中   4行4列?

不,在C语言中,将电路板存储在真正 2D数组中的效率也不低。内存中的布局与您所描述的1D布局没有区别,因此用于检索元素的索引计算完全等同于所提供的代码。

某些其他语言(例如Java)的情况却并非如此,在Java中,每个维度都需要单独的指针取消引用,并且数组(作为对象)具有除元素之外的其他关联数据和元数据。像这样的数据结构也可以用C形成,但是尽管可以像多维数组一样对其建立索引,但实际上其结构和布局是完全不同的。

尽管您要询问的一维和二维情况在逻辑上是等效的,但值得一提的是,在不太可能的情况下,编译器选择不内联对linearConv()的调用。您提供的特定代码,插入该功能会使一维版本的效率比二维版本低。

  

此外,正在访问数组[0]之类的错误,取消引用指针   (即* pointer),访问struct成员(即struct.member或   sutuct-> member)不需要关键区域的原子操作?

不,按照您的意思,这些都不是原子的。