作为示例,假设表达式sys->pot.atoms[item->P.kind].mass
在循环内求值。循环只改变item
,因此表达式可以简化为atoms[item->P.kind].mass
通过将变量定义为atoms = sys->pot.atoms
在循环之前。像 gcc 这样的现代编译器是否会自动执行这种优化(如果启用了优化)?无论表达式的数量有多少,它是否可靠atoms[item->P.kind].mass
存在于循环内部?
是的,这是一个非常常见的优化,称为循环不变代码运动 https://en.wikipedia.org/wiki/Common_subexpression_elimination,也称为提升或标量提升,通常作为公共子表达式消除 https://en.wikipedia.org/wiki/Common_subexpression_elimination.
计算有效sys->pot.atoms
如果编译器可以确定两者都没有,则在循环之前仅执行一次sys
nor sys->pot.atoms
可以在循环内部修改。
但请注意,正如评论者Groo, 如果sys
or sys->pot
or sys->pot.atoms
被指定为volatile
,那么如果表达式只计算一次是不正确的sys->pot.atoms
在循环体或表达式中多次求值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)