如果 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
)。
考虑以下因素:
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
)。