Я знаю, что в 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
, что, однако, вы подозревали, дико небезопасно. - person jonny   schedule 04.03.2019std::mem::transmute
будет делать то, что вы пытаетесь достичь, но это небезопасно, поэтому, возможно, объяснение того, что вы пытаетесь сделать, потенциально покажет лучший способ достижения этого. - person Optimistic Peach   schedule 04.03.2019