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;
}
答案 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