知乎热榜 ( ) • 2024-04-27 02:22
灵剑的回答

Rust的所谓内存安全模型,按我理解就是强行要求所有的对象构成一个以单向own关系组成的树形结构,然后无论修改哪个对象,都要求从根开始一级一级mut出来,编译器保证同一个节点同时要么只有一个可写的引用,要么没有可写的引用但可以有任意多个只读的引用,这样就保证了修改对象的时候不会有其他人正在读取。代价就是牺牲了细粒度的并发,比如原本一个树形结构的两个叶子节点是可以同时修改,或者一个在修改另一个在读取的,现在就不行了,这是允许编译器进行上述检查所必须的。

那么链表如果按照链表头依次own后面的节点来理解,修改某个节点就必须从链表头开始把所有前面的节点全都mut引用出来,这显然是不能接受的,完全失去了链表的存在意义。

使用所谓Arena进行变通,用下标来代替引用,所有链表节点存在一个池子里面,这样把链表的own关系改成链表对象own所有节点,固然是可以编译通过也可以用,但实质上那个下标就相当于裸指针,里面的数值是否正确是完全没有保证的,释放节点也相当于是纯手动,这基本上就是纯C实现时候的情况,顶多是如果搞错了只会panic不会出现非法操作引起安全漏洞,你说safe了吗,如safe……我是并不赞同这种模式的,这顶多算是变通。