链表上意外的慢元素删除

问题描述

我一直在用“通过编写太多链表来学习 rust”的指导来试验 rust 中的数据结构,首先由我自己实现,然后像页面上说的那样。这样做时,我发现了一些奇怪的东西,与书上显示的相比,我对 List 删除的实现(否则需要它的尾递归)太慢了,我的直觉说它应该更快。
这里是List和Node的声明

type Link<T> = Option<Rc<Node<T>>>;

struct Node<T> {
    value: T,next: Link<T>,}

struct List<T> {
    head: Link<T>,}

impl<T> List<T> {
    fn new() -> Self {
        List { head: None }
    }

    fn append(&self,value: T) -> List<T> {
        List { head: Some(Rc::new(Node { 
            value,next: self.head.clone()
        }))}
    }

    fn tail(&self) -> List<T> {
        List { head: self.head.as_ref().and_then(|node| node.next.clone()) }
    }
}

我对 drop 的幼稚实现
我用 None 替换头部,然后将列表头部值设置为下一个,最后列表的所有节点都应为 None

impl<T> Drop for List<T> {
    fn drop(&mut self) {
        /* Slow one */
        while let Some(node) = std::mem::replace(&mut self.head,None) {
            self.head = node.next.clone();
        }
    }
}

页面的实现
它取链表的头部(留下一个None,droppable),并递归地取链表的所有节点

impl<T> Drop for List<T> {
    fn drop(&mut self) {
        /* Fast one */
        let mut head = self.head.take();
        while let Some(node) = head {
            if let Ok(mut node) = Rc::try_unwrap(node) {
                head = node.next.take();
            } else {
                break;
            }
        }
    }
}

这是 Godbolt 链接 godbolt
有谁知道为什么会这样??在godbolt 链接中是main,我在这里测试了列表的丢弃能力。
“我显然使用发布模式进行的所有测试”

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)