应该可以调整任何具有提前退出的通用算法以满足要求。但这很棘手,因为如果 CPU 能够发现你只是在无用地旋转,它就会更快地执行代码。
最安全的设计是消除循环内的所有分支。不if
,,&&
或||
允许,只是按位运算符。
对于整理strcmp
,我们想记住字符串之间的第一个区别以及哪一侧更大。所以算法自然会根据是否发现差异来做完全不同的事情。我们可以使用位掩码模拟一个分支。
int obscure_strcmp( char const *l, char const *r ) {
int result = 0;
do {
// compute result in case we need it
int diff = * r - * l; // positive if l < r, negative if r < l
int diff_pos = diff > 0; // 1 if l < r
int diff_neg = - ( diff < 0 ); // -1 if r < l
// assign result if it was still zero
unsigned mask = - ( result == 0u ); // all 1's if waiting for a diff
result |= ( diff_pos | diff_neg ) & mask;
} while ( * l ++ && * r ++ );
return result;
}