我想知道编译器(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的两个偏好?
有什么想法? 感谢
答案 0 :(得分:2)
此优化称为Loop-invariant code motion。循环不变量(循环内部永不改变的东西)被移到循环之外,以避免反复重复计算相同的东西。
GCC支持它,并由-fmove-loop-invariants
标志启用:
-fmove-loop-invariants
在新循环优化器中启用循环不变运动传递。在-O1级别启用
今天,无论您如何制定代码,编译器几乎总是足够聪明地做“正确的事情”。专注于编写最简单,最干净,最容易阅读(对于人类!)的代码。让编译器通过启用优化来处理其余的事情。 -O2
是常用的。