c++ - 数组引用速度与按位运算符

标签 c++ arrays performance reference bit-manipulation

我目前正在制作国际象棋游戏,我将我的信息存储在两个 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/

相关文章:

javascript - 使用脚本添加两个同名的数组值

c++ - 错误 : incompatible types in assignment of 'char*' to 'char [4000]'

c++ - 如何使子部件独立?

c++ - 为什么日历周数在星期一凌晨 3 点更新,而不是在午夜?

C++:在 cin.getline() 中使用指针

javascript - 应用 regEx 后获取 javascript 数组中的值

c# - String.Where 性能比较差

c# - 将 int 转换为 char 的最快方法是什么

r - 是否有比 Base R 中的 expand.grid 更快的配对比较方法?

c++ - OpenGL 圆柱体