问题描述
由于Stockfish是国际象棋引擎中评分最高的引擎,并且众所周知,它具有相当高的cpu效率,因此我决定打开其源代码并尝试了解其运行方式。
我遇到了这段代码,只是将位板移到某个方向(北,南,东...)
template<Direction D>
constexpr bitboard shift(bitboard b) {
return D == norTH ? b << 8 : D == SOUTH ? b >> 8
// ...........
}
// bitboard is a type deFinition for uint64_t
shift< direction >(bitboard);
constexpr bitboard shift(bitboard b,Direction D) {
return D == norTH ? b << 8 : D == SOUTH ? b >> 8
// ...........
}
不起作用?第一种方式是否更有效率?
解决方法
在这种情况下需要一个模板是什么,为什么会这样
// omitted code
不起作用?
具有给定参数的版本也可以使用。
第一种方法在任何方面都更有效率吗?
是的,使用模板将更加有效,因为D
总是在编译时进行评估,因为它是constexpr
。
在运行时评估总是需要一个函数调用(尽管可以内联),并从堆栈中评估参数(即使是内联,也可能要花费一些寄存器操作)。