假设我在C99中for(int j=0; j < t->k; j++)
,t->k
在整个循环迭代中没有变化。编译器是否优化了这一行,或者每次循环迭代会有一个解除引用操作?
换句话说,会
tmpk = t->k;
for(int j = 0; j < tmpk; j++)
对于大量迭代更好吗?
答案 0 :(得分:4)
在一般情况下,这取决于t
是否被声明为restrict
;在没有明确的别名限制的情况下,编译器不能假设没有其他指针提供修改k
的路径。
当然,如果编译器可以通过检查循环体来证明t->k
是不变的,它可以选择将取消引用移出循环体,或者如果优化器有错误则不正确地执行此操作。 / p>
在本地变量中明确缓存t->k
的值会相当可靠地强制解决问题。 : - )