共享公用子表达式

概念

共享公用子表达式(Common Subexpression Elimination, CSE)是指将程序中重复出现的相同计算提取为临时变量,避免多次计算相同表达式。

示例

// 优化前:重复计算
int x = arr[i] + offset;
int y = arr[i] * 2 + offset;
 
// 优化后:提取公用子表达式
int tmp = arr[i];
int x = tmp + offset;
int y = tmp * 2 + offset;

编译器支持

大多数现代编译器会自动执行公用子表达式消除。但在某些情况下,表达式的形式略有不同(如 arr[i].xarr[i].y 共享 arr[i] 的地址计算),编译器可能无法识别。

手工优化的价值

  • 帮助编译器生成更优代码
  • 减少带来的限制
  • 配合进一步提升性能

相关笔记:

链接到