Stockfish 12源代码:替换函数参数的模板

问题描述

由于Stockfish是国际象棋引擎中评分最高的引擎,并且众所周知,它具有相当高的cpu效率,因此我决定打开其源代码并尝试了解其运行方式。

我遇到了这段代码,只是将位板移到某个方向(北,南,东...)

从鱼类12源中提取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
  // ...........
}

不起作用?第一种方式是否更有效率?

解决方法

在这种情况下需要一个模板是什么,为什么会这样

// omitted code

不起作用?

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

第一种方法在任何方面都更有效率吗?

是的,使用模板将更加有效,因为D总是在编译时进行评估,因为它是constexpr

在运行时评估总是需要一个函数调用(尽管可以内联),并从堆栈中评估参数(即使是内联,也可能要花费一些寄存器操作)。