是否优化了多个顺序阵列访问? > 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; }

是否优化了多个顺序阵列访问? > 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; },c++,C++,当您启用优化时,几乎所有编译器不仅会预计算公共索引3*i,还会预计算指针array+(3*i)*sizeof(*array)大多数优化器都会注意到这一点,是的。但是,如果您想鼓励优化器,以下方法是: 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; } 公

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

大多数优化器都会注意到这一点,是的。但是,如果您想鼓励优化器,以下方法是:

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

公共子表达式消除是最简单和最常用的优化之一。一般来说,您可以依靠它来完成这项工作。

对于现代编译器,您可以在大多数情况下依靠编译器来完成这项巧妙的工作,而不是自己尝试任何事情。例如,请参见

在确定这是一个瓶颈之前,不要担心这一点。请注意(我无法直接回答您的问题),对于您来说,最好先进行计算,然后在每个索引中使用它,而不是3*I,因为如果算法发生变化,您必须替换多行。将计算保持在一个位置有助于代码的可维护性。@TheCapn-如果算法发生变化,他可能需要2*i和4*i来表示不同的索引。为什么现在担心?等它变了,我真的很喜欢这个配方。在某些(大多数?)情况下,对优化器的支持有一点点是有道理的。此外,这段代码看起来更干净。很好的参考!如果我们编写简单的代码,编译器也很可能理解它。如果我们太“聪明”,我们和编译器都不能从代码中做出任何东西。