Pointers 如果D包含类型为B的对象作为其第一个成员,则在B*和D*之间强制转换是否安全?

Pointers 如果D包含类型为B的对象作为其第一个成员,则在B*和D*之间强制转换是否安全?,pointers,casting,alias,d,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); } 这个程序保证写两次真吗?我在D语言参考中的任何地方都找不到这些规则。D中的结构与C中的结构一样工作,因此您可以对其内部布局有合理的期望。不过,

考虑以下几点:

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);
}

这个程序保证写两次真吗?我在D语言参考中的任何地方都找不到这些规则。

D中的结构与C中的结构一样工作,因此您可以对其内部布局有合理的期望。不过,要小心

从D到B的浇铸应该很好。向另一个方向强制转换是不安全的,因为y将引用原始B变量后面的内容

从D*转换到B*的一种更简单、安全的方法是使用D.B的地址B*B=&D.B