在编译器中,短语"loop-invariant code motion"描述了循环中代码的表达式或语句,它们不会从迭代变为迭代,因此可以移动到循环之外进行一次计算。
我理解这句话的“循环不变”部分,但“代码运动”是什么意思?
答案 0 :(得分:7)
“代码运动”只是意味着代码被移出循环,因为如果它在循环内部重复执行或在循环外执行一次,它将没有任何区别。编译器正在获取不需要在循环中的代码并将其移出它以进行优化。
这是一个例子:
for ( int x=0; x < string.length(); x++) {
//other code here
}
如果编译器知道循环中没有任何内容改变字符串的长度,它只需将字符串的长度硬编码到程序中,而不是在适当的方法上插入对方法length()
的实际调用。字符串,因为方法调用将始终返回相同的结果,只会浪费内存和处理器时间。方法调用的代码在循环之前移动而不是保留在其中。这篇文章称之为'代码运动',虽然我只是称之为普通的优化,因为大多数优化涉及移动代码。 :d
答案 1 :(得分:1)
似乎从维基百科的文章中可以看出,循环不变代码实际上是作为优化步骤移出循环外的。
答案 2 :(得分:1)
术语&#34;代码动作&#34;可以用于任何情况,其中一些代码被移动到其他地方,并且程序的语义不变。当然,编译器需要一些好处,例如寄存器压力降低,代码大小减少,计算量减少等等。这是一个非常通用的优化,易于描述,但很难实现&#34;以及#34;。循环不变代码运动的情况是一个简单的例子,其中很多计算被删除,但对于其他情况,通常很难说某个输入的最佳方法是什么。困难在于所有法律代码动议,以及最佳,次优或至少有益的动作。