是从循环中的结构指针取消引用成员优化为循环不变量?

时间:2014-08-05 02:34:32

标签: c gcc optimization compiler-construction

假设我在C99中for(int j=0; j < t->k; j++)t->k在整个循环迭代中没有变化。编译器是否优化了这一行,或者每次循环迭代会有一个解除引用操作?

换句话说,会

tmpk = t->k;
for(int j = 0; j < tmpk; j++)

对于大量迭代更好吗?

1 个答案:

答案 0 :(得分:4)

在一般情况下,这取决于t是否被声明为restrict;在没有明确的别名限制的情况下,编译器不能假设没有其他指针提供修改k的路径。

当然,如果编译器可以通过检查循环体来证明t->k是不变的,它可以选择将取消引用移出循环体,或者如果优化器有错误则不正确地执行此操作。 / p>

在本地变量中明确缓存t->k的值会相当可靠地强制解决问题。 : - )