1

bionic で memcmp.c が次のようになっていることがわかりました。

 30 int memcmp(const void *s1, const void *s2, size_t n)
 31 {
 32     const unsigned char*  p1   = s1;
 33     const unsigned char*  end1 = p1 + n;
 34     const unsigned char*  p2   = s2;
 35     int                   d = 0;
 36 
 37     for (;;) {
 38         if (d || p1 >= end1) break;
 39         d = (int)*p1++ - (int)*p2++;
 40 
 41         if (d || p1 >= end1) break;
 42         d = (int)*p1++ - (int)*p2++;
 43 
 44         if (d || p1 >= end1) break;
 45         d = (int)*p1++ - (int)*p2++;
 46 
 47         if (d || p1 >= end1) break;
 48         d = (int)*p1++ - (int)*p2++;
 49     }
 50     return d;
 51 }

for ループで同じロジックが 4 回繰り返されるのはなぜですか? 繰り返せないの?

Thx、ビクター

4

1 に答える 1

2

それは手動ループ展開です。1回だけ実行することも、無限ループの代わりに通常のループを使用して、4回以上実行することもできます. これにより、コンパイラーが生成されたコードを最適化するより良い機会が得られると誰かが考えました。

詳細については、http://en.wikipedia.org/wiki/Loop_unrollingを確認してください。

于 2012-06-20T05:37:48.187 に答える