【发布时间】:2013-10-01 09:39:20
【问题描述】:
将一种类型转换为另一种类型是 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之类的标志编译吗?
【问题讨论】:
标签: c