gpt4 book ai didi

rust - Vec 会导致堆栈溢出吗?

转载 作者:行者123 更新时间:2023-12-03 11:25:23 26 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

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

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

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

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

关于rust - Vec 会导致堆栈溢出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65511939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com