c++ - 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
// ...........
}
不行?第一种方法是否更有效?
解决方案
在这种情况下需要有一个模板,为什么会这样
// omitted code
不行?
带有给定参数的版本也可以工作。
第一种方法是否更有效?
是的,使用模板会更有效,因为D
总是在编译时评估,因为它是一个constexpr
.
在运行时进行评估总是需要一个函数调用(尽管它可以被内联),并从堆栈中评估参数(这可能会花费一些寄存器操作,即使是内联的)。
推荐阅读
- ruby-on-rails - Rspec:声明一个变量,该变量将作为记录创建到方法中
- javascript - 如何在另一个模型中使用猫鼬模型?
- html - 在拥有的远程服务器上实现自定义字体不起作用
- cygwin - Cygwin scp 目录路径
- websphere - 我在 Process Admin 中看不到组中的成员
- bash - 如何将 sed 参数存储在变量中以在 BASH 中进行参数替换
- django - 我还能如何在 postgresql/django python shell 中编写带有时区的时间戳?
- crosstool-ng - crosstool-ng 下载工具链组件 tarball 'automake' 失败
- vb.net - 在 vb.net 中的 CREATE TABLE 期间将 rtf 添加到 MS Access 字段
- hibernate - Hibernate JPA CriteriaQuery with count 和 where 谓词