Since Stockfish is the highest rated chess engine, and it's known to be quite CPU-effiecient I decided to open its source code and try to understand and see how it works.
I came across this snippet of code, simply shifts a bitboard to a certain direction (north, south, east...)
TAKEN FROM STOCKFISH 12 SOURCE: 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
Calling the function
shift< direction >(bitboard);
What is the need to have a template in this context, and why would something like
constexpr Bitboard shift(Bitboard b,Direction D) {
return D == NORTH ? b << 8 : D == SOUTH ? b >> 8
// ...........
}
not work? Is the first way more efficient in any way?
What is the need to have a template in this context, and why would something like
// omitted code
not work?
The version with the parameter given will work as well.
Is the first way more efficient in any way?
Yes, using the template will be more efficient, since D
is always evaluated at compile time, as it's a constexpr
.
Evaluating at runtime would always require a function call (though it could be inlined), and evaluation of the parameter from the stack (which may cost a few register operations, even if inlined).