【发布时间】:2019-07-25 05:00:59
【问题描述】:
我知道,在 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的工作,但正如您所怀疑的那样,这非常不安全。 -
我对这种模式并不十分熟悉,能否请您扩展一下您想要实现的目标?
std::mem::transmute会做你想要做的事情,但它是不安全的,所以也许提供你想要做的事情的解释可能会揭示一个更好的实现方法。 -
我正在尝试将二叉树转换为链表,这意味着不消耗额外的内存来构建链表。
标签: linked-list rust binary-tree type-punning