我知道在Rust中,编译器不能保证按照声明顺序获取结构体数据,以节省内存(我也相信一些C代码优化器正在做同样的事情)。现在假设我有一个二叉树,并想将其转换为双向链表。在C语言中,我会声明两个结构体:
typedef struct tree{
void* left_child;
void* right_child;
void* data;
}tree_t;
对于树形结构,需要:
typedef struct list{
void* before;
void* after;
void* data;
}list_t;
对于链表而言,如果我现在想把树转换成一个列表,我可以直接在原地进行操作,将树的内存与列表结构相连,并改变指针:
tree_t mytree;
/*fill tree*/
list_t *list_p;
list_p = (list_t)&mytree;
/*change pointers accordingly*/
但是在Rust中如何做到这一点呢?没有使用unsafe
代码,这是否可能?
现在我有了我的树:
struct TreeNode<'a, T> {
left_child: BinaryTreeLink<'a, T>,
right_child: BinaryTreeLink<'a, T>,
data : &'a T,
}
type BinaryTreeLink<'a, T> = Option<Box<TreeNode<'a, T>>>;
列表如下:
struct ListNode<'a, T> {
before: ListLink<'a, T>,
after: ListLink<'a, T>,
data : &'a T,
}
type ListLink<'a, T> = Option<Box<ListNode<'a, T>>>;
但是我如何现在有效地将它们转换?
mem::transmute
的工作,但正如你所怀疑的那样,这是极其不安全的。 - jonnystd::mem::transmute
可以完成你试图实现的功能,但它是不安全的,因此提供一下你试图做什么的解释可能会揭示出更好的实现方法。 - Optimistic Peach