【问题标题】:Stockfish 12 source code: Templates replacing function parametersStockfish 12 源代码:替换函数参数的模板
【发布时间】:2021-01-19 10:40:44
【问题描述】:

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

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

取自 STOCKFISH 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
  // ...........
}

不工作?第一种方式是否更有效?

【问题讨论】:

  • “第一种方式效率更高吗?”是的。
  • @n.'pronouns'm。你能在答案中加上“为什么”吗
  • @AryanParekh D 在模板情况下在编译时进行评估,这就是它更高效的原因(通过性能)。
  • @πάνταῥεῖ 这是否意味着与第二种方法相比,使用它总是更好?如果您能将信息放入答案中,我将不胜感激!

标签: c++ templates bitboard


【解决方案1】:

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

// omitted code

不工作?

给定参数的版本也可以。

第一种方式效率更高吗?

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

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

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2018-11-12
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多