热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Vec会导致计算器溢出吗?

letvector:Vec<u8>=Vec::new();如果向量变得太大,上面代码中的向量是否会导致计算器溢出?

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 个字段。

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






推荐阅读
author-avatar
勿缘无悔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有