首页 > 解决方案 > Stockfish 12 源代码:替换函数参数的模板

问题描述

由于Stockfish是评价最高的国际象棋引擎,而且众所周知它的 CPU 效率很高,我决定打开它的源代码并尝试了解并了解它是如何工作的。

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

取自 STOCKFISH 12 来源:下载

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

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

标签: c++templatesbitboard

解决方案


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

// omitted code

不行?

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

第一种方法是否更有效?

是的,使用模板会更有效,因为D总是在编译时评估,因为它是一个constexpr.

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


推荐阅读