作者:勿缘无悔 | 来源:互联网 | 2023-09-07 16:14
let vector: Vec = Vec::new();
如果向量变得太大,上面代码中的向量是否会导致计算器溢出?
let vector: Vec> = Vec::new();
这个怎么样?因为它的元素在堆上。
let vector: Box> = Box::new(Vec::new());
我假设在上面的代码中没有 stackoverflow 应该是可能的,我正确吗?
回答
不,实际数据在堆上。所以不会出现堆栈溢出。
堆栈上的是容量、长度和指向堆上实际数据的指针。如果需要再生长,则在堆上进行。如果它被移动(不是克隆),那么复制的只是长度、容量和指向数据的指针(按位浅拷贝)。
不是实际的实现,但如果你必须实现 Vector 那么你将从:
pub struct Vec {
ptr: Unique,
cap: usize,
len: usize,
}
您会看到ptr
实际上指向数据所在的堆位置。堆栈上的向量将仅由几个字段组成,如上面提到的 3 个字段。
您不能在堆栈上增长对象,因为如果允许任何对象增长,则将对象推送到堆栈框架上,它会覆盖其他对象。在增长堆上,如果连续内存不可用,则将整个数据移动到具有更新容量的另一个地方;如果有连续的内存块可用,则容量会立即增长。