内存别名使用
概念
内存别名(Memory Aliasing)指两个不同的指针指向同一个内存位置。编译器无法判断指针是否重叠,因此必须保守地假设它们可能指向同一位置。
对优化的影响
void add(int *a, int *b, int n) {
for (int i = 0; i < n; i++)
a[i] += b[i];
// 如果 a 和 b 指向同一区域,结果不同
}编译器不能将 b[i] 提前加载到寄存器,因为每次对 a[i] 的写入可能改变 b[i] 的值(如果它们重叠)。
解决方法
使用局部变量消除别名影响:
void add_fast(int *a, int *b, int n) {
int local_a, local_b;
// 通过局部变量累积,最后写回
for (int i = 0; i < n; i++) {
// 编译器可以确定局部变量没有别名问题
}
}关键点
- 内存别名是编译器优化的主要障碍之一
- 配合 可以显著提升性能
restrict关键字可告知编译器指针不重叠(C99)
相关笔记:
链接到
- 上一个知识点:5.5 函数调用优化限制
- 下一个知识点:5.7 CPE与程序性能度量