


本文主要介绍别名消除。实验环境是CentOS7 + GCC。
1. 优化方法简述
C语言中为了方便编码,为变量定义了别名,但在同一程序中两个以上的指针引用相同的存储位置时,将存在指针别名的问题。指针别名是指多个指针指向同一个对象时,它们互相成为其他指针的别名。别名的存在导致编译器会默认多个访存间含有依赖关系进而影响程序的优化,此时可以借助别名分析技术进行分析,确定两个指针是否指向内存中的同一个对象。但在程序员没有指出或者编译器没有分析出变量之间的别名关系时,别名的存在将会影响到程序依赖关系的判断,进而影响编译器对程序实施优化的效果。
2. 示例分析
在实际编译时由于缺少更多信息支持,编译器会保守地认为指针a和b之间互为别名,因此并不会对该循环进行向量化优化。此时可以使用restrict关键字来限定指针变量,表明该变量没有别名。左边给出了示例优化前代码aliElimin1.c,右边给出了示例优化后代码aliElimin2.c。

编译运行命令:
(1)gcc aliElimin1.c -o aliElimin1
(2)./aliElimin1
(3)gcc aliElimin2.c -o aliElimin2
(4)./aliElimin2

汇编代码生成命令:
(1)gcc -S aliElimin1.c -o aliElimin1.s
(2)gcc -S aliElimin2.c -o aliElimin2.s

3. 总结
需要注意的是,在使用restrict关键字说明程序中不存在别名后,即可进行后续的向量化,生成更高效率的汇编代码。但若代码中已经存在别名,再添加restrict关键字会导致错误的结果。此外为了减少别名对于程序性能的影响,可以在编译器中添加相应的选项,确定变量或指针之间的别名是否相关。
4. 参考资料
(1)[C / C++] 内存别名和性能优化 - 知乎 (zhihu.com)
(2)编译器优化那些事儿(6):别名分析概述_开源_openEuler_InfoQ写作社区


