Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust Vec会导致堆栈溢出吗? let vector:Vec=Vec::new();_Rust - Fatal编程技术网

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,
}