内存别名使用

概念

内存别名(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)

相关笔记:

链接到