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

Is it safe to cast between B* and D* if D contains an object of type B as its first member?

考虑以下因素:

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 语言参考中找不到这些规则。

D "work like they do in C"中的结构,因此您可以对其内部布局有合理的预期。不过要小心hidden members of nested structs

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

D* 转换为 B* 的一种更简单、安全的方法是采用 D.b 的地址 (B* b = &d.b)。