在Rust中,来自Vec和VecDeque的方法extend
和drain
是复制项目的内容,还是像列表一样移动项目?
假设reserve
reserve已经被调用了prior,并且Vec/VecDeque已经有了元素的空间。
编辑:为了澄清,在内存级别上,下面的代码会发生什么?内容是从Vec复制到VecDeque的,还是仅仅是指针的变化,比如在链表中删除/插入?
let mut a: Vec<i32> = (0..10).collect();
let mut b: VecDeque<i32> = VecDeque::new();
b.reserve(10);
b.extend(a.drain(..));
2条答案
按热度按时间mctunoxg1#
a
和b
的数据位于内存中的固定位置。因为b
已经有足够的容量,所以不会重新分配b
。但是,数据本身将从
a
内存复制到b
,之后a
将被标记为空。为了演示,这里有一个小程序,它显示了在这样一个过程中
Vec
的内部状态:ykejflvf2#
Vec
和VecDeque
不是链表,也不是操作链表。它们在内存中是连续的,所以是的,发生了按位复制。复制的语义可以是复制或移动,这取决于类型是否实现Copy
。