代码移动

概念

代码移动(Code Motion)是将循环内部不依赖于循环变量的计算提取到循环外部,避免每次迭代都重复执行相同的计算。

示例

// 优化前:每次循环都调用strlen
for (int i = 0; i < strlen(s); i++) {
    // ...
}
 
// 优化后:将strlen提到循环外
int len = strlen(s);
for (int i = 0; i < len; i++) {
    // ...
}

编译器限制

然而,编译器通常不能自动执行上述优化,因为 ——strlen 的调用结果可能被函数内部的修改所改变。编译器必须保守地假设最坏情况。

适用场景

  • 循环不变量的计算
  • 数组长度提取
  • 常量表达式计算
  • 不依赖循环变量的指针计算

相关笔记:

链接到