Rust Vec会导致堆栈溢出吗? let vector:Vec=Vec::new();
如果向量增长过大,上面代码中的向量会导致堆栈溢出吗Rust Vec会导致堆栈溢出吗? let vector:Vec=Vec::new();,rust,Rust,如果向量增长过大,上面代码中的向量会导致堆栈溢出吗 let vector: Vec<u8> = Vec::new(); let vector:Vec=Vec::new(); 这个怎么样?因为它的元素在堆上 let vector: Vec<Box<u8>> = Vec::new(); let vector:Box=Box::new(Vec::new()); 我假设在上面的代码中不可能出现堆栈溢出,对吗?不,实际数据在堆上。因此不会出现堆栈溢出 堆栈上的内
let vector: Vec<u8> = Vec::new();
let vector:Vec=Vec::new();
这个怎么样?因为它的元素在堆上
let vector: Vec<Box<u8>> = Vec::new();
let vector:Box=Box::new(Vec::new());
我假设在上面的代码中不可能出现堆栈溢出,对吗?不,实际数据在堆上。因此不会出现堆栈溢出 堆栈上的内容是容量、长度和指向堆上实际数据的指针。如果需要重新生长,则在堆上进行。如果它被移动(而不是克隆),那么复制的只是长度、容量和指向数据的指针(按位浅拷贝) 不是实际的实现,但如果必须实现Vector,则将从以下内容开始:
let vector: Box<Vec<u8>> = Box::new(Vec::new());
pub-struct-Vec{
ptr:独一无二,
上限:使用,
len:使用,
}
您可以看到ptr
实际上指向数据所在的堆位置。堆栈上的向量将仅由几个字段组成,如上面提到的3个字段
不能在堆栈上增长对象,因为在堆栈帧上推送对象。如果允许任何对象增长,它将在其他对象上运行。在堆上,如果连续内存不可用,则将整个数据移动到另一个容量较新的位置;如果连续内存块可用,则容量的增长是即时的。如果移动或复制(未克隆),则复制的只是长度、容量和指向数据的指针(按位浅拷贝)。-此句子不正确,您不能复制
Vec
,只能移动它。长度/数据/容量三元组的按位浅拷贝将被严重破坏,因为当拷贝和原始拷贝都被删除时,它将导致双空闲。(甚至在此之前,它会破坏Rust的别名保证和更多。)是的,move是按位复制,因此Rust不会在从vec移动时调用Drop。编辑删除了显式“复制”字,因为vec不实现复制特性。所以,若Vec包含在试图实现Copy-trait的结构中,那个么编译器会抱怨。
pub struct Vec<T> {
ptr: Unique<T>,
cap: usize,
len: usize,
}