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



我目前正在为大学开发类似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],取消引用指针(即*指针),访问不需要关键区域的结构成员(即struct.member或sutuct->member)原子操作吗?

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

双:

T board[4][4];

和:

T board[4 * 4];

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

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

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

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

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

在计算机科学中存在一种叫做局部性原则的东西。无论是在空间上还是在时间上。

关于数组,我们得到了空间的位置,它说在arr[1][1]访问元素也可能导致访问元素arr[1][2]

查看此答案,了解数组的访问(按行/按列)如何影响效率。

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

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

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

不,在 C 语言中,将电路板存储在真正的2D 阵列中同样有效。 内存中的布局与您描述的一维布局没有区别,因此用于检索元素的索引计算与所呈现的代码中的索引计算完全等效。

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

尽管您询问的 1D 和 2D 情况在逻辑上是等效的,但也许值得注意的是,万一编译器选择不对您提供的特定代码中的linearConv()进行内联调用,插入该函数会使 1D 版本的效率低于 2D。

此外,正在访问类似数组[0]的arrray,取消引用指针 (即 *指针),访问结构成员(即结构成员或 不需要关键区域的SUTUCT->成员)原子操作?

不,这些都不是你所说的原子。

相关内容

  • 没有找到相关文章

最新更新