由于Stockfish是收视率最高的国际象棋引擎,并且众所周知它具有相当的CPU效率,因此我决定打开其源代码并尝试理解并查看其工作方式。
我遇到了这段代码,只是将位板移到某个方向(北,南,东...)
从十二种货源中获取:Download

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
  // ...........
}

不行?第一种方式是否更有效率?

最佳答案


给定参数的版本也可以使用。

是的,使用模板将更加有效,因为D总是在编译时进行评估,因为它是constexpr
在运行时评估总是需要一个函数调用(尽管可以内联),并需要从堆栈中评估参数(即使内联,也可能要花费一些寄存器操作)。

10-05 22:27