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

10

我正在编写一些生成几何元素向量的代码:

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和一些其他字段的大型结构体。该文件可能包含超过1000个这样的结构体,但不会太多以至于它们无法全部放入内存(至少现在还不会)。此外,我应该做什么?
Box::new(Geom_Entity { ...

然后把盒子放在向量中?

3
惯用的 Rust 代码使用 PascalCase(无下划线)表示类型名称(GeomEntity),并使用 snake_case 表示变量和函数名称(parse_geom)。 - Shepmaster
1个回答

18

Vec的文档中提到(强调我的):

如果一个Vec已经分配了内存,那么它所指向的内存位于堆上。

因此,是的,向量的成员由向量拥有,并存储在堆上。


一般来说,在将元素放入Vec之前对其进行装箱是浪费的——这会导致额外的内存分配和间接引用。有时您需要额外的分配或间接引用,所以并非绝对不能这样做。

另见:


5
Vec<Box<T>> 中的 T 是 trait 类型,这可能是元素本身被放入 Box 的最常见情况。 - Josh Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接