rust - Vec 会导致堆栈溢出吗?
问题描述
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 个字段。
您不能在堆栈上增长对象,因为如果允许任何对象增长,则将对象推送到堆栈框架上,它将在其他对象上运行。在堆增长时,如果连续内存不可用,则将整个数据移动到具有更新容量的另一个位置;如果连续的内存块可用,那么容量的增长是即时的。
推荐阅读
- django - 我想要以前版本的 Django 应用程序的代码。我怎么才能得到它?我试过 git reset --hard 但它不起作用。它显示未找到电子邮件
- node.js - 如何从 NodeJS Lambda 访问 NFS 共享
- go - 将服务器流与 grpc-web 和 authboss 一起使用,呼叫仍处于挂起状态(并且不起作用)
- php - 如何使用 Google Cloud Healthcare API HttpBody 类?
- excel - 如果文件已经存在,则在后面加上一个数字重命名文件
- regex - Mod rewrite rule for optional language in URL
- django - 如何使用 2 个字段/控件(金额和贷方/借方)制作 django 自定义小部件
- python - Python - google-trans-new 对正在运行的代码抛出错误
- react-native - 如何为反应导航设置身份验证流程?
- python - Python中有没有类似于Matlab的deconvblind的函数?