单维数组和二维数组(矩阵)之间是否存在效率差异?

问题描述 投票:2回答:3

我目前正在为大学开发C级游戏。老师提供了一些代码,他将电路板存储在内存中的方式是单维数组,电路板有16个元素(4x4电路板),0行位于[0,3]位置,第2行位于[他还使用下面的函数将二维坐标(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]的arrray,解除引用指针(即*指针),访问不需要关键区域的struct成员(即struct.member或sutuct-> member)原子操作?

c arrays multithreading multidimensional-array
3个回答
2
投票

这个板将由多个线程管理,这可能有助于多线程同步?

我认为没有理由期待这一点。

我的问题是:将电路板存储在具有4行和4列的二维阵列(矩阵)中效率较低吗?

不,在C中,将电路板存储在真正的2D阵列中的效率并不低。内存中的布局与您描述的1D布局无法区分,因此检索元素的索引计算完全等同于所呈现的代码中的索引计算。

其他一些语言也是如此,例如Java,其中每个维度都需要一个单独的指针取消引用,而作为对象的数组除了元素之外还有其他关联的数据和元数据。像这样的数据结构也可以在C中形成,但是虽然它可以被索引为好像它是一个多维数组,但它的结构和布局实际上是完全不同的。

虽然您所询问的1D和2D情况在逻辑上是等价的,但值得注意的是,在不太可能的情况下,编译器选择不在您呈现的特定代码中内联对linearConv()的调用,插入该函数将使得1D版本效率比2D低一点。

另外,访问一个像array [0]这样的数组,取消引用一个指针(即*指针),访问一个不需要关键区域的struct成员(即struct-> member的struct.member)原子操作?

不,从你的意思来说,这些都不是原子的。


5
投票

将电路板存储在具有4行和4列的二维阵列(矩阵)中效率较低吗?

都:

T board[4][4];

和:

T board[4 * 4];

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

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

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


3
投票

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

然而,直接来说,访问这些元素对效率有很大影响,例如对于缓存目的。

在计算机科学中存在着一种叫做地方性的原则。在空间或时间。

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

查看this answer如何访问数组(行/列)可能会影响效率。

© www.soinside.com 2019 - 2024. All rights reserved.