rust 为什么std集合迭代器使用raw pointer + rectomData而不是普通的ref?

s3fp2yjn  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(90)

例如,切片Iter https://doc.rust-lang.org/src/core/slice/iter.rs.html#62和LinkedList Iter https://doc.rust-lang.org/src/alloc/collections/linked_list.rs.html#74
两者都存储原始指针变体(例如,Nonprofit)。
我想这个slice::Iter可以构建为

pub struct Iter<'a, T: 'a> {
  slice_ref: &'a [T],
  current_pos: usize,
}

那么,为什么这里首选/需要原始指针?

wgeznvg7

wgeznvg71#

切片迭代器对性能非常敏感。它们在几乎所有的Rust代码中都有使用,它们可能是所有std中最热门的代码。因此,它们的设计和实现都经过精心构建和基准测试,以尽可能提高性能,并且每个更改都需要进行性能测量。
特别是,你所建议的形式是相当糟糕的(甚至非常糟糕)。它增加了字段计数,这意味着更多的寄存器被占用,并且它需要对每个元素进行加法(将当前偏移量添加到切片的开始)。使用指针可以避免这种情况。
他们可能会使用一个单一的切片,并推进它,但有处理ZST的复杂性,坦率地说,它似乎只是更容易有它所有的原始指针。

zbwhf8kr

zbwhf8kr2#

解决链表迭代器实现:您可能会注意到LinkedList在内部不使用引用。
标准的链表是双向链接的--意味着链表中的一个节点同时连接到下一个元素和上一个元素--这使得所有权不太清楚,因为它的结构是自引用的。它还必须提供元素的突变,这将完全防止内部引用。双向链表与Rust的所有权模型并不匹配。如果你想了解更多,可以通读Learn Rust With Entirely Too Many Linked Lists;最后一章的高潮是一个与标准几乎相同的设计。
所以LinkedList在内部使用指针,因此迭代器实现也是如此。

相关问题