字符数组的替代方法
Alternatives to array of chars
我想知道从性能的角度来看,我可以使用什么标准容器作为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
快,这取决于编译器和体系结构。
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 复制几乎为空的数组的最快方法
- 通过JNI传递数据数组的最快方法是什么
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 数组元素打印的递归方法
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++数组队列实现方法错误
- 寻找一种更好的方法来表示无符号字符数组
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 创建异构顶点数据数组的可移植方法
- 打印字符数组地址的正确方法
- 还有其他方法可以在数组中写入多维数组吗?
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 从非类型模板参数声明 constexpr 数组的可移植方法
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案