函数调用优化限制

问题描述

函数可能有副作用(Side Effects),导致编译器不能轻易地将函数调用移出循环或消除重复调用。

常见副作用

  • 修改全局变量
  • 修改传入指针指向的内容
  • 执行 I/O 操作
  • 修改静态局部变量

示例:strlen 的困境

// 编译器不能安全地优化成:
int len = strlen(s);
for (int i = 0; i < len; i++)
 
// 因为假设循环体内 s 的内容可能被修改
// 标准库的 strlen 被声明为无副作用时可用内建函数优化

解决方式

  • 使用 -Ofast 等激进优化标志
  • 手动执行
  • 使用纯函数属性标注(如 __attribute__((pure))
  • 内联函数让编译器看到完整上下文

关键点

编译器必须在保守安全激进优化之间平衡。程序员手动提取不变量是可靠的方式。


相关笔记:

链接到