在写“不等于扫描”布尔阵列的过程中, 我结束了写这个循环:GCC循环展开古怪
// Heckman recursive doubling
#ifdef STRENGTHREDUCTION // Haswell/gcc does not like the multiply
for(s=1; s<BITSINWORD; s=s*2) {
#else // STRENGTHREDUCTION
for(s=1; s<BITSINWORD; s=s+s) {
#endif // STRENGTHREDUCTION
w = w XOR (w >> s);
}
我观察到的是,GCC WOULD展开的S = S什么* 2循环, 但不是s = s + s循环。这稍微不直观,因为 加法的循环次数分析应该比IMO更简单 。我怀疑gcc知道循环次数,并且仅仅是co。。
有没有人知道这个 行为对gcc的部分是否有一些很好的理由? 我问这是出于好奇...
[展开版本,顺便说一句,跑得比循环慢公平一点。]
感谢, 罗伯特