指针混叠表示可使用不同指针名称访问相同存储器位置的情况。在 C/C++ 中,严格混叠规则表示如果指针指向截然不同的类型,则假定这些指针不混叠。混叠会对程序执行顺序施加强约束。以下显示了 p
和 q
的混叠。
图 1. 指针混叠
以下指针混叠示例中,指针 p
和 q
指向相同地址。中间列显示的是由编译器生成的汇编语言代码,右侧显示的是运算和时钟周期。
图 2. 混叠代码示例
通过在此代码示例中添加 restrict 关键字,编译器即可最优化生成的汇编语言,以增加硬件中的运算并行度。以下示例显示了如何使用 restrict 关键字来防止混叠使用更少的时钟周期来完成同样的运算。
图 3. 使用 restrict 关键字来避免混叠
存储器依赖关系
代码中的存储器依赖关系可能限制编译器尝试执行的最优化种类。例如,在以下代码中,xyz
与指针 p
和 q
可能无关。但在函数代码中,指针 p
和指针 q
指向同一个全局变量 xyz
。编译器必须保证在上述情况下都能正确执行。鉴于这些不同种类的存储器依赖关系,编译器需采取保守操作并限制最优化。
图 4. 不相关的指针