如果我创建一个结构并将其放入向量中,它是驻留在堆上还是堆栈上?
Posted
技术标签:
【中文标题】如果我创建一个结构并将其放入向量中,它是驻留在堆上还是堆栈上?【英文标题】:If I make a struct and put it in a vector, does it reside on the heap or the stack? 【发布时间】:2017-09-24 07:13:41 【问题描述】:我正在编写一些生成几何元素向量的代码:
struct Geom_Entity
// a bunch of geometric information,
// like tangent planes, force vectors, etc
代码正在从文本文件(例如)解析许多这些实体,因此我们目前有一个函数:
parse_Geom(x: String) -> Vec<Geom_Entity>
// a bunch of code
这些几何实体是具有 17 个f64
s 和一些其他字段的大型结构。该文件可能包含超过 1000 个这样的文件,但不会太多以至于无法全部放入内存(至少目前如此)。
另外,我应该这样做
Box::new(Geom_Entity ...
然后将框放入向量中?
【问题讨论】:
惯用的 Rust 代码使用PascalCase
(无下划线)作为类型名称 (GeomEntity
),使用 snake_case
作为变量和函数名称 (parse_geom
)。
【参考方案1】:
documentation for Vec
说(强调我的):
如果
Vec
已分配内存,则它指向的内存在堆上
所以是的,向量的成员归向量所有并存储在堆上。
在一般中,在将元素放入Vec
之前对其进行装箱是一种浪费——存在额外的内存分配和间接寻址。有时您需要额外的分配或间接寻址,所以永远不要说永远。
另见:
Does Rust box the individual items that are added to a vector?【讨论】:
Vec<Box<T>>
其中T
是一个特征类型,这可能是元素本身被装箱的最常见情况。以上是关于如果我创建一个结构并将其放入向量中,它是驻留在堆上还是堆栈上?的主要内容,如果未能解决你的问题,请参考以下文章
android - 格式化 Double 并将其放入 TextView 中,不带逗号(如果需要)
快速创建一个对象的新实例并将其放入一个带有 TabBarView 按钮的数组中