我目前正在为大学开发用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)原子操作?
答案 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)不需要关键区域的原子操作?
不,按照您的意思,这些都不是原子的。