如果D包含B类对象作为其第一个成员,那么在B *和D *之间进行转换是否安全?

时间:2015-02-06 09:19:06

标签: pointers casting alias d

请考虑以下事项:

struct B { int x; }
struct D { B b; int y; }

void main() {
    auto b = cast(B*) new D();
    writeln(b.x == b.x);
    auto d = cast(D*) b;
    writeln(b.x == d.b.x);
}

该程序是否保证两次写入“true”?我在D语言参考中找不到这些规则。

1 个答案:

答案 0 :(得分:4)

D&#34中的结构;就像在C"中那样工作,因此您可以对其内部布局有合理的期望。但是要警惕hidden members of nested structs

D投射到B应该没问题。从另一个方向投射是不安全的,因为y将引用原始B变量之后的内容。

D*投射到B*的更简单,更安全的方法是使用D.b的地址(B* b = &d.b)。