C中的一种常见策略是将一种类型转换为另一种类型,这取决于C结构的布局有一定的保证。
像GLib这样的库依靠这个实现面向对象的继承,基本上:
struct Base
{
int x;
int y;
};
struct Derived
{
struct Base b;
int z;
};
这使得Base*
指针能够被分配给Derived
对象的地址。但我也意识到“ 严格别名 ”规则,这是编译器隐含的假设,即不同类型的指针不能指向相同的地址。(这使编译器能够执行某些优化。)
那么,这两件事情是如何协调的呢?许多C库,包括Glib,CPython等,都使用上述策略在类型之间进行转换。他们都只是简单地编译像no-strict-aliasing
?