别名 (计算)

维基百科,自由的百科全书
跳到导航 跳到搜索

别名是指内存中的一个数据位置可以通过程序的多个符号名来访问。因此通过一个名字修改数据意味着所有别名关联的值也改变了。别名使理解、分析、优化程序变得困难。别名分析英语Alias analysis用于分析处理程序中的别名的信息。

优化时冲突[编辑]

优化编译器英语Optimizing compiler在存在指针时往往对变量做出保守假设。如常量传播能否使用。代码重排序(code reordering)也受别名的影响,这可能会改善指令调度英语instruction scheduling或允许更多的循环优化英语loop optimization.

C语言C99标准,提出了严格别名规则(strict aliasing rule)见section 6.5, paragraph 7。指出使用不同类型的指针访问同一内存位置是违规的。编译器因而可以假定不同类型的指针不会是别名,这可能带来性能的巨大提升。[1]一些著名项目,如Python 2违反了此规则。[2]Linux内核也解决了类似问题。[3] 使用gcc编译选项-fno-strict-aliasing可关闭此规则。

C++11规定下述广义左值类型为严格别名规则的例外情形:

  • 对象的动态类型
  • cv量化版本
  • signed或unsigned版本
  • 聚合类型(如struct、class)或union类型,包含此前所指的类型作为它的元素,或非静态数据成员(包括递归嵌套类型)
  • 动态类型的基类型
  • char或unsigned

参见[编辑]

参考文献[编辑]

  1. ^ Mike Acton. Understanding Strict Aliasing. 2006-06-01. 
  2. ^ Neil Schemenauer. ANSI strict aliasing and Python. 2003-07-17. 
  3. ^ Linus Torvalds. Re: Invalid compilation without -fno-strict-aliasing. 2003-02-26. 
  4. ^ Michael Barr. Software Based Memory Testing. 2012-07-27. 

外部链接[编辑]