如何进行索引旋转

时间:2017-04-04 11:54:19

标签: c++11 c11

哪种方式可以作为循环列表访问固定大小的数组?

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指令且跳转计数相同。哪种方法应该是默认的?

这个问题对两种标记语言都有效。

0 个答案:

没有答案