Vec 会导致计算器溢出吗?

Mic*_*elo 3 rust

let vector: Vec<u8> = Vec::new();
Run Code Online (Sandbox Code Playgroud)

如果向量变得太大,上面代码中的向量是否会导致计算器溢出?

let vector: Vec<Box<u8>> = Vec::new();
Run Code Online (Sandbox Code Playgroud)

这个怎么样?因为它的元素在堆上。

let vector: Box<Vec<u8>> = Box::new(Vec::new());
Run Code Online (Sandbox Code Playgroud)

我假设在上面的代码中没有 stackoverflow 应该是可能的,我正确吗?

Abh*_*t_K 9

不,实际数据在堆上。所以不会出现堆栈溢出。

堆栈上的是容量、长度和指向堆上实际数据的指针。如果需要再生长,则在堆上进行。如果它被移动(不是克隆),那么复制的只是长度、容量和指向数据的指针(按位浅拷贝)。

不是实际的实现,但如果你必须实现 Vector 那么你将从:

pub struct Vec<T> {
    ptr: Unique<T>,
    cap: usize,
    len: usize,
}
Run Code Online (Sandbox Code Playgroud)

您会看到ptr实际上指向数据所在的堆位置。堆栈上的向量将仅由几个字段组成,如上面提到的 3 个字段。

您不能在堆栈上增长对象,因为如果允许任何对象增长,则将对象推送到堆栈框架上,它会覆盖其他对象。在增长堆上,如果连续内存不可用,则将整个数据移动到具有更新容量的另一个地方;如果有连续的内存块可用,则容量会立即增长。