字符数组的替代方法

Alternatives to array of chars

本文关键字:方法 数组 字符      更新时间:2023-10-16

我想知道从性能的角度来看,我可以使用什么标准容器作为char board[8][8]的替代品。需要经常访问该板进行读写操作。在算法过程中,可能会构造多达100万个新棋盘。每个元素只允许三个可能的值:- 1,0,1,所以一个棋盘的有用位的总数实际上是128。我想到了一个围绕std::bitset<128>构建的自定义类型,其中定义了所有必需的(内联)操作符[],==,=等,以便将其访问为2d数组,但我不确定与原始char[8][8]相比,这是否会加快访问速度。我也不关心内存使用方面的收益,这不是问题。

我将使用std::array<signed char, 64>并将其访问为a[8 * i + j] *。没有必要进入子字节粒度,因为这些64B可能会在相同的缓存行中,并且您可以像这样快速访问。您甚至可以尝试int数组进行比较;单词大小的访问可能会更快。

*)甚至std::array<std::array<char>, 8>, 8>,正如正确的评论。本质上是一样的,尽管可能更容易使用。

如果你不关心内存使用情况,不要使用bitset。事实上,最快的解决方案可能是对硬件来说最容易使用的解决方案。

您将不得不配置文件,但我怀疑使用单词大小的1d数组将是最快的:

long board[64];

显然,board[x][y]变成了board[x * 8 + y];

如果你想为它创建一个c++类接口,请确保将函数内联。


记住,总是profile!signed char有可能比long快,这取决于编译器和体系结构。