在寫「不等於掃描」布爾陣列的過程中, 我結束了寫這個循環: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的部分是否有一些很好的理由? 我問這是出於好奇...
[展開版本,順便說一句,跑得比循環慢公平一點。]
感謝, 羅伯特