在这两种情况下,您都应该说unsigned char * aa = &array1[h];
(或array2[h]
第二个循环)。当您可以做到并确定时,希望编译器会解除该索引操作是没有意义的。
这两个循环正在做不同的事情:
循环 1x[i] ^ x[i-1]
在索引到之前执行aa
,而循环 2aa
按x[i]
之前索引,然后在^ x[i-1]
之后执行。
无论如何,我会使用指针 for x[i]
and 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] ];
}
我不确定哪个会更快。
再一次,有些人会说编译器的优化器会为你做这件事,但帮助它并没有什么坏处。