函数调用优化限制
问题描述
函数可能有副作用(Side Effects),导致编译器不能轻易地将函数调用移出循环或消除重复调用。
常见副作用
- 修改全局变量
- 修改传入指针指向的内容
- 执行 I/O 操作
- 修改静态局部变量
示例:strlen 的困境
// 编译器不能安全地优化成:
int len = strlen(s);
for (int i = 0; i < len; i++)
// 因为假设循环体内 s 的内容可能被修改
// 标准库的 strlen 被声明为无副作用时可用内建函数优化解决方式
- 使用
-Ofast等激进优化标志 - 手动执行
- 使用纯函数属性标注(如
__attribute__((pure))) - 内联函数让编译器看到完整上下文
关键点
编译器必须在保守安全和激进优化之间平衡。程序员手动提取不变量是可靠的方式。
相关笔记:
链接到
- 上一个知识点:5.4 共享公用子表达式
- 下一个知识点:5.6 内存别名使用