哪种方式可以作为循环列表访问固定大小的数组?
void foo()
{
volatile int data[10];
for(unsigned i = 0; i < 999; ++i)
{
data[ i % 10 ] = i;
}
}
void bar()
{
volatile int data[10];
unsigned j = 0;
for(unsigned i = 0; i < 999; ++i)
{
data[ j ] = i;
j = j > 8 ? 0 : j + 1;
}
}
我一直认为,第一种形式是远的,因为避免了分支。但是,对于带有-O1的x86_64的gcc 6.2,foo()
seems to invoke a代价高昂的mul
指令且跳转计数相同。哪种方法应该是默认的?
这个问题对两种标记语言都有效。