unsigned char * aa = &array1[h];
どちらの場合も、 (またはarray2[h]
2 番目のループの場合)と言う必要があります。コンパイラがそのインデックス操作を解除してくれることを期待しても意味がありません。
2 つのループは異なることを行っています。
ループ 1 はx[i] ^ x[i-1]
にインデックスを付ける前に行いますがaa
、ループ 2は前にインデックスaa
を付けてx[i]
から後に実行^ x[i-1]
します。
x[i]
いずれにせよ、とのポインターを使用しx[i-1]
、ループをアンロールするので、ループ 1 は次のようになります。
unsigned char * aa = &array1[h];
unsigned char * px = &x[1];
unsigned char * px1 = &x[0];
for (i = 1; i < 10; i++){
*px = aa[ *px ^ *px1 ]; px++; px1++;
}
for ( ; i < 10000; i += 10 ){
*px = aa[ *px ^ *px1 ]; px++; px1++;
*px = aa[ *px ^ *px1 ]; px++; px1++;
*px = aa[ *px ^ *px1 ]; px++; px1++;
*px = aa[ *px ^ *px1 ]; px++; px1++;
*px = aa[ *px ^ *px1 ]; px++; px1++;
*px = aa[ *px ^ *px1 ]; px++; px1++;
*px = aa[ *px ^ *px1 ]; px++; px1++;
*px = aa[ *px ^ *px1 ]; px++; px1++;
*px = aa[ *px ^ *px1 ]; px++; px1++;
*px = aa[ *px ^ *px1 ]; px++; px1++;
}
別の方法として、単一のp
ポインターを使用し、次のようにハード オフセットを使用することもできます。
unsigned char * aa = &array1[h];
unsigned char * px = &x[0];
for (i = 1; i < 10; i++){
px[1] = aa[ px[1] ^ px[0] ]; px++;
}
for ( ; i < 10000; i += 10, px += 10 ){
px[ 1] = aa[ px[ 1] ^ px[0] ];
px[ 2] = aa[ px[ 2] ^ px[1] ];
px[ 3] = aa[ px[ 3] ^ px[2] ];
px[ 4] = aa[ px[ 4] ^ px[3] ];
px[ 5] = aa[ px[ 5] ^ px[4] ];
px[ 6] = aa[ px[ 6] ^ px[5] ];
px[ 7] = aa[ px[ 7] ^ px[6] ];
px[ 8] = aa[ px[ 8] ^ px[7] ];
px[ 9] = aa[ px[ 9] ^ px[8] ];
px[10] = aa[ px[10] ^ px[9] ];
}
どちらが速いかわかりません。
繰り返しになりますが、コンパイラのオプティマイザがこれを行うと言う人もいますが、それを支援しても害はありません。