kir*_*rbo 3 c++ performance pointers chess
我正在研究棋盘的表示,我打算将它存储在32字节数组中,其中每个字节将用于存储两个部分.(这样每件只需要4位)
以这种方式执行此操作会导致访问板的特定索引的开销.您是否认为,此代码可以优化或完全不同的访问索引方法可以使用?
C++
char getPosition(unsigned char* c, int index){
//moving pointer
c+=(index>>1);
//odd number
if (index & 1){
//taking right part
return *c & 0xF;
}else
{
//taking left part
return *c>>4;
}
}
void setValue(unsigned char* board, char value, int index){
//moving pointer
board+=(index>>1);
//odd number
if (index & 1){
//replace right part
//save left value only 4 bits
*board = (*board & 0xF0) + value;
}else
{
//replacing left part
*board = (*board & 0xF) + (value<<4);
}
}
int main() {
char* c = (char*)malloc(32);
for (int i = 0; i < 64 ; i++){
setValue((unsigned char*)c, i % 8,i);
}
for (int i = 0; i < 64 ; i++){
cout<<(int)getPosition((unsigned char*)c, i)<<" ";
if (((i+1) % 8 == 0) && (i > 0)){
cout<<endl;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我对你对国际象棋表征的看法以及上述方法的优化同样感兴趣,作为一个独立的问题.
非常感谢
编辑
谢谢你的回复.前段时间我创建了跳棋游戏,我使用的是64字节的棋盘表示.这次我尝试了一些不同的方法,只是为了看看我喜欢什么.记忆不是一个大问题.比特板肯定在我的名单上尝试.谢谢
这是过早优化的问题.你的国际象棋棋盘需要64个字节来存储,现在需要32个.这真的有什么结果呢?你是否真的分析了情况,看看你是否需要保存这些内存?
假设你用最少的最佳搜索方法之一,直线AB搜索深度d没有启发式,你生成搜索之前所有有可能的行动,为您的主板所需的那么绝对最大内存将是的sizeof(板)*W*D.如果我们假设一个相当大的W = 100且大D = 30那么你将在深度为D的内存中有3000块板.64k对32k ......真的值得吗?
另一方面,您增加了访问电路板[位置]所需的操作量,每次搜索会调用数百万次.
建立国际象棋时,你最终要找的主要是cpu周期,而不是内存.如果您的目标是手机或其他东西,这可能会有所不同,但即便如此,在您达到足够的深度以引起任何内存问题之前,您会更加担心速度.
至于我喜欢哪种表示...我喜欢位板.没有做过很多严肃的测量,但我确实比较了我制造的两个引擎,一个位板和一个阵列,而位板一个更快,可以达到比另一个更大的深度.