严格混叠规则 - 2022.1 简体中文

Versal ACAP AI 引擎编程环境 用户指南 (UG1076)

Document ID
UG1076
Release Date
2022-05-25
Version
2022.1 简体中文

严格混叠规则规定,如果各指针指向截然不同的类型,则假定这些指针不会发生混叠,但 char*void* 除外,这两者可混叠到任何其它数据类型。如下图所示,其中显示了对象全类 (universe) 和关联的指针。

图 1. 对象全类
指针与 universe 类型关联:U(T)
T 表示模板 (template),在前图中显示了各种模板,包括 int 全类和 float 全类;此外每个设计还有一个 MyClass 全类。此外,默认还有一个包含所有全类的 char 全类。
全类不发生混叠
指针 p 只能指向 int 全类内的任意地址,而指针 q 则只能指向 float 全类内的任意地址。因此,指针 p 与指针 q 无法混叠。
衍生的指针指向原始全类
衍生自 restrict 指针的指针被视为 restrict 指针,并指向相同的受限存储器区域。请参阅 衍生的指针
char* 全类包含所有全类
char 指针可指向所有全类中的任意变量。

对于两个相同类型的指针,如下所示,其中 pq 均为 int,则编译器采用保守方式,并应用混叠,导致性能损失。

图 2. 性能损失

对于两个不同类型的指针,如下所示,其中 pintqfloat,编译器会应用严格混叠规则,如果存在混叠,则会发生未定义的行为。

图 3. 两个不同类型的指针