是否优化了多个顺序阵列访问?

时间:2011-07-21 15:20:39

标签: c++

C ++编译器会自动优化以下代码来计算3 * i只一次,并递增结果,还是程序员必须编码?

void writeToArray(int i, int a, int b, int c)
{
   array[3*i][1]=a;
   array[3*i][2]=b;
   array[3*i][3]=c;
}

4 个答案:

答案 0 :(得分:7)

大多数优化工具都会接受这个,是的。但是,如果您想鼓励优化器,请按以下方式进行操作:

void writeToArray(int i, int a, int b, int c)
{
   const int offset = 3 * i;
   array[offset][1]=a;
   array[offset][2]=b;
   array[offset][3]=b;
}

答案 1 :(得分:5)

当您启用优化时,几乎所有编译器不仅会预先计算公共索引3*i,还会预先计算指针array + (3*i)*sizeof (*array)

答案 2 :(得分:3)

常见的Subexpression消除是最简单和最常用的优化之一。一般来说,你可以依靠这样做。

答案 3 :(得分:3)

使用现代编译器,您大多数时间都可以依靠编译器执行聪明的工作,而不是自己尝试任何东西。例如,请参阅http://dl.fefe.de/optimizer-isec.pdf