我目前正在制作国际象棋游戏,我将我的信息存储在两个 8 x 8 数组中。第一个存储团队类型(1 代表白色,0 代表无,-1 代表黑色),第二个存储棋子类型(1 代表兵,2 代表车,等等)。由于我正在为游戏编写 AI,我想知道是否可以将这两张 map 组合在一起,形成一个 8 x 8 阵列。信息将像这样存储在一个字节中:
00 A BC DEF
其中A代表如果移动,BC代表团队:
00 A 01 DEF for white,
00 A 10 DEF for black,
00 A 00 DEF for nothing
和DEF以类似的方式表示棋子类型。我将通过 & 使用字节掩码来访问这些值。所以这是我的问题。计算机是否能够使用较小的数组更快地访问信息,或者按位函数是否会使它运行太慢?内存对我来说不是问题。
最佳答案
这里的答案是“是的,不是的,也许”。这实际上取决于编译器的性能、它运行的处理器以及最重要的空间或时间。
我的直觉是在位掩码中存储会更慢,无论是一次存储一个字节还是按位模式,检索都差不多。
原因是该商店涉及:
value = (value & ~ bits) | new_value;
bits
是您要使用的位的掩码(例如,对于颜色,它将是 0x18 或 00011000。
检查值涉及单个和操作:
value & bits;
另一方面,如果您使用三个 [或四个] 字节来存储每个值,您将获得一个单字节存储和每个元素的单字节加载。这几乎是现代机器上任何东西所能达到的最快速度。
处理器拥有多少缓存也会对此产生影响 - 从主内存中获取数据甚至执行 L2 缓存获取都比两三个额外的简单指令慢。
但对于此类问题的真正答案是:编写一些代码并测量速度。确保你这样做是真实的,这样你就有了正确数量的其他指令,正确数量的数据(处理 5 个字节与构建可能的移动 6 步不同,计算了 100000 个选择[全板]对于每个移动级别)。
关于c++ - 数组引用速度与按位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35050408/