严格混叠规则规定,如果各指针指向截然不同的类型,则假定这些指针不会发生混叠,但 char*
和 void*
除外,这两者可混叠到任何其他数据类型。如下图所示,其中显示了对象全类 (universe) 和关联的指针。
图 1. 对象全类
- 指针与 universe 类型 U(T) 关联
- T 表示模板 (template),在前图中显示了各种模板,包括
int
全类和float
全类;此外每个设计还有一个MyClass
全类。此外,默认还有一个包含所有全类的char
全类。 - 全类不发生混叠
- 指针
p
只能指向int
全类内的任意地址,而指针q
则只能指向float
全类内的任意地址。因此,指针p
与指针q
无法混叠。 - 衍生的指针指向原始全类
- 衍生自 restrict 指针的指针被视为 restrict 指针,并指向相同的受限存储器区域。请参阅 衍生的指针。
-
char*
全类包含所有全类 -
char
指针可指向所有全类中的任意变量。
对于两个相同类型的指针,如下所示,其中 p
和 q
均为 int
,则编译器采用保守方式,并应用混叠,导致性能损失。
图 2. 性能损失
对于两个不同类型的指针,如下所示,其中 p
是 int
,q
是 float
,编译器会应用严格混叠规则,如果存在混叠,则会发生未定义的行为。
图 3. 两个不同类型的指针