首页 > 解决方案 > Vec 会导致堆栈溢出吗?

问题描述

let vector: Vec<u8> = Vec::new();

如果向量变得太大,上面代码中的向量会导致堆栈溢出吗?

let vector: Vec<Box<u8>> = Vec::new();

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

let vector: Box<Vec<u8>> = Box::new(Vec::new());

我假设在上面的代码中应该不可能有 stackoverflow,对吗?

标签: rust

解决方案


没有实际数据在堆上。所以不会有堆栈溢出。

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

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

pub struct Vec<T> {
    ptr: Unique<T>,
    cap: usize,
    len: usize,
}

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

您不能在堆栈上增长对象,因为如果允许任何对象增长,则将对象推送到堆栈框架上,它将在其他对象上运行。在堆增长时,如果连续内存不可用,则将整个数据移动到具有更新容量的另一个位置;如果连续的内存块可用,那么容量的增长是即时的。


推荐阅读