嵌套结构元素取消引用的开销和编译器优化
Overhead and compiler optimization of dereference of nested struct elements
我想知道编译器(更具体地说是带有 -O3 的 gcc)can/will 是否优化了嵌套的结构元素取消引用(或者甚至没有嵌套)。
例如,执行以下代码是否有意义
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 的 2 个引用?
有什么想法吗?
谢谢
此优化称为 Loop-invariant code motion。循环不变量(循环内永不改变的事物)被移出循环,以避免一遍又一遍地重新计算相同的事物。
GCC 支持它,并通过 -fmove-loop-invariants
标志启用:
-fmove-loop-invariants
Enables the loop invariant motion pass in the new loop optimizer. Enabled at level -O1
如今,无论您如何编写代码,编译器几乎总是足够聪明来完成 "right thing"。专注于编写最简单、最干净、最容易阅读(对人类而言!)的代码。让编译器通过启用优化来处理其余的事情。 -O2
常用。
我想知道编译器(更具体地说是带有 -O3 的 gcc)can/will 是否优化了嵌套的结构元素取消引用(或者甚至没有嵌套)。
例如,执行以下代码是否有意义
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 的 2 个引用?
有什么想法吗? 谢谢
此优化称为 Loop-invariant code motion。循环不变量(循环内永不改变的事物)被移出循环,以避免一遍又一遍地重新计算相同的事物。
GCC 支持它,并通过 -fmove-loop-invariants
标志启用:
-fmove-loop-invariants
Enables the loop invariant motion pass in the new loop optimizer. Enabled at level -O1
如今,无论您如何编写代码,编译器几乎总是足够聪明来完成 "right thing"。专注于编写最简单、最干净、最容易阅读(对人类而言!)的代码。让编译器通过启用优化来处理其余的事情。 -O2
常用。