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
.
在运行时求值总是需要函数调用(尽管它可以内联),并从堆栈中求值参数(这可能需要一些寄存器操作,即使是内联)。
由于 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
.
在运行时求值总是需要函数调用(尽管它可以内联),并从堆栈中求值参数(这可能需要一些寄存器操作,即使是内联)。