嵌套结构元素的解引用的开销和编译器优化

时间:2015-02-27 04:55:07

标签: c gcc optimization struct compiler-optimization

我想知道编译器(gcc与-O3更具体)是否可以优化嵌套的struct element dereferences(或者甚至不嵌套)。

例如,执行以下代码是否有任何意义

register int i = 0;
register double multiple = struct1->struct2->element1;
for (i = 0; i < 10000; i++)
  result[i] = multiple * -struct1->struct3->element3[i];

而不是

register int i = 0;
for (i = 0; i < 10000; i++)
  result[i] = struct1->struct2->element1 * -struct1->struct3->element3[i];

我正在寻找最优化的,但如果编译器将优化它,我将不会通过循环结构解引用。如果是的话,我认为我最好的选择是以下

register int i = 0;
register double* R = &result[0];
register double* amount = &struct1->struct3->element[0];
for (i = 0; i < 10000; i++, R++, amount++)
  *R = struct1->struct2->element1 * -*amount;

消除了所有不必要的解引用等(我认为)。是否可以优化对element3的两个偏好?

有什么想法? 感谢

1 个答案:

答案 0 :(得分:2)

此优化称为Loop-invariant code motion。循环不变量(循环内部永不改变的东西)被移到循环之外,以避免反复重复计算相同的东西。

GCC支持它,并由-fmove-loop-invariants标志启用:

  

-fmove-loop-invariants   在新循环优化器中启用循环不变运动传递。在-O1级别启用

今天,无论您如何制定代码,编译器几乎总是足够聪明地做“正确的事情”。专注于编写最简单,最干净,最容易阅读(对于人类!)的代码。让编译器通过启用优化来处理其余的事情。 -O2是常用的。