如果我创建一个结构并将其放入向量中,它是驻留在堆上还是堆栈上?

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 个f64s 和一些其他字段的大型结构。该文件可能包含超过 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&lt;Box&lt;T&gt;&gt; 其中T 是一个特征类型,这可能是元素本身被装箱的最常见情况。

以上是关于如果我创建一个结构并将其放入向量中,它是驻留在堆上还是堆栈上?的主要内容,如果未能解决你的问题,请参考以下文章

android - 格式化 Double 并将其放入 TextView 中,不带逗号(如果需要)

Rust 是不是将添加到向量中的单个项目装箱?

快速创建一个对象的新实例并将其放入一个带有 TabBarView 按钮的数组中

如何将双精度向量传递给构造函数,然后在子类中访问其数据(在 C++ 中)?

如何使用 CSV 创建本地用户并将它们放在一个组中

线程函数无法从堆上分配的缓冲区中读取字符