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

Stockfish 12 source code: Templates replacing function parameters

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

不工作?第一种方式效率更高吗?

What is the need to have a template in this context, and why would something like

// omitted code

not work?

带有给定参数的版本也可以。

Is the first way more efficient in any way?

是的,使用模板会更有效率,因为 D 总是在编译时求值,因为它是 constexpr.

在运行时求值总是需要函数调用(尽管它可以内联),并从堆栈中求值参数(这可能需要一些寄存器操作,即使是内联)。