[英]How does Vec::push work for self referencing types?
引用自vec::push
實現:
pub fn push(&mut self, value: T) {
// This will panic or abort if we would allocate > isize::MAX bytes
// or if the length increment would overflow for zero-sized types.
if self.len == self.buf.capacity() {
self.buf.reserve_for_push(self.len);
}
unsafe {
let end = self.as_mut_ptr().add(self.len);
ptr::write(end, value);
self.len += 1;
}
}
這里如果T
是自引用類型,如何保證在ptr::write
之后有一個有效的 object end
?
Rust中,所有類型都是可移動的,移動后必須有效; ptr::write
本質上只是將值移動到新位置。
自引用對象只能通過隱藏在Pin
后面以避免被移動來工作,這是因為Pin
需要間接訪問並避免提供對“不可移動”值的&mut T
的訪問。 但是引腳本身仍然是可移動的,因此將一個引腳傳遞給.push()
不是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.