我已经读过如果你声明这样的两个结构:
struct Node {
int a, b, c;
};
struct DerivedNode {
struct Node base;
int d, e, f;
};
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用指针:
struct DerivedNode myDerivedNode;
struct Node *regularNode = (struct Node *) &myDerivedNode;
regularNode->a = 3;
Run Code Online (Sandbox Code Playgroud)
换句话说,地址偏移量a, b, c在struct Node和中是相同的struct DerivedNode.所以你可以从中获得一种多态性,在那里你可以传递一个强制(struct Node *)广播的DerivedNode指针,无论在哪里通常都会采用Node指针.
我的问题是这种行为是否得到保证.我知道有一些奇怪的内存对齐问题,编译器有时会重新排序字段以实现更好的内存打包.base除了开始之外,这个领域是否会位于任何地方struct DerivedNode?
Dav*_*nan 13
这保证符合标准.结构中的成员按照您指定的顺序按顺序排列,第一个成员始终显示在偏移0处.
ANSI C标准的相关摘录:
结构是由一系列成员组成的类型,其存储以有序序列分配.
这表明成员按顺序排列.
结构对象中可能存在未命名的填充,但不是在其开头.
意味着第一个成员位于偏移0处.
注:标准摘录摘自ISO/IEC 9899:TC3 2007年9月草案第6.7.2.1节.
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |