在C中将一种类型转换为另一种类型是一种常见的策略,依赖于C结构的布局具有某些保证的事实.像GLib这样的库依赖于它来实现面向对象的继承.基本上:
struct Base
{
int x;
int y;
};
struct Derived
{
struct Base b;
int z;
};
Run Code Online (Sandbox Code Playgroud)
这使得Base*
指针可以分配给Derived
对象的地址.
但我也知道" 严格别名 "规则,这是编译器隐含的假设,即不同类型的指针不能指向同一个地址.(这使编译器能够执行某些优化.)
那么,这两件事情如何协调?许多C库,包括Glib,CPython等,使用上述策略在类型之间进行转换.它们都只是用旗帜编译no-strict-aliasing
吗?
Car*_*rum 20
在这种情况下,没有违反严格的别名. struct Derived
包含一个struct Base
.语言标准明确允许这种行为.从C11 6.7.2.1结构和联盟说明者,第15段:
指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然.
归档时间: |
|
查看次数: |
3470 次 |
最近记录: |