【发布时间】:2019-10-11 17:44:13
【问题描述】:
我正在用 C 从头开始制作一个基于位板的国际象棋引擎。移动生成过程对时间特别敏感。目前,我的代码是这样的:
void generate_moves(Position *p, Colour side, Move *list) {
if(side == WHITE) {
Bitboard b1 = p->piece_bitboards[BLACK_KNIGHT];
Bitboard top_rank_mask = MASK_RANK[RANK8];
...
} else {
Bitboard b1 = p->piece_bitboards[WHITE_KNIGHT];
Bitboard top_rank_mask = MASK_RANK[RANK1];
...
}
}
以及其他数百行代码,它们要么是黑白镜像,要么是相同的。但是,这似乎很容易出错并且对我来说很模糊。
因此将在每个分叉处用三元运算符替换大型 if-else 以提高可读性:
void generate_moves(Position *p, Colour side, Move *list) {
Bitboard b1 = p->piece_bitboards[side == WHITE ? WHITE_KNIGHT :
BLACK_KNIGHT];
Bitboard top_rank_mask = MASK_RANK[side == WHITE ? RANK8 : RANK1];
...
}
有类似的表现吗?所有三元运算符都依赖于变量侧,变量侧只能假设常量值 WHITE 或 BLACK。
【问题讨论】:
-
它们不可能在编译时完成,因为它们依赖于运行时变量。
-
你已经用数百个分支替换了一个分支。自然,它应该以(性能)为代价。作为旁注,我想说似乎没有任何充分的理由对这个问题投反对票。没关系。
标签: c performance ternary-operator