兼容类型与严格别名规则

时间:2013-09-25 16:59:27

标签: c

在C语言中,将一种类型转换为另一种类型是一种常见的策略,它依赖于C结构的布局具有某些保证的事实。像GLib这样的库依赖于它来实现面向对象的继承。基本上是:

struct Base
{
  int x;
  int y;
};

struct Derived
{
  struct Base b;
  int z;
};

这样可以将Base*指针分配给Derived对象的地址。

但我也知道“ strict aliasing ”规则,这是编译器隐含的假设,即不同类型的指针不能指向同一个地址。 (这使编译器能够执行某些优化。)

那么,这两件事情如何协调?许多C库,包括Glib,CPython等,使用上述策略在类型之间进行转换。它们都只是用no-strict-aliasing等标志进行编译吗?

1 个答案:

答案 0 :(得分:20)

在这种情况下,没有违反严格别名的行为。 struct Derived 包含一个struct Base。语言标准明确允许这种行为。从C11 6.7.2.1结构和联合说明符,第15段:

  

指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单位),反之亦然。