我有一个占用太多空间的类型要在堆栈上分配:
struct Foo {
lots_of_bytes: [u8; 1024 * 10],
bar: bool,
baz: isize,
}
有两个明显的解决方案:
let foo = Box::new(Foo::new());
或
struct Foo {
lots_of_bytes: Box<[u8; 1024 * 10]>,
bar: bool,
baz: isize,
}
总结一下,我要么在堆上分配整个struct,要么我可以让struct拥有堆指针。这些解决方案中的任何一个都被认为是&#34;惯用的&#34;解?或者它是严格主观的还是依赖于背景?
答案 0 :(得分:5)
我认为在这里问自己的问题是:将这个结构放在堆栈中是否有意义?如果答案是否定的,你应该在堆上强制执行分配。要实现这一目标,您有两种选择:
lots_of_bytes: Box<[u8; 1024 * 10]>
。lots_of_bytes: [u8; 1024 * 10]
并确保Foo
的所有构造函数都返回Box<Foo
(因此无法在堆栈上创建Foo
。在我看来,第一种选择更好:
Foo
的结构定义清楚地表明数据必须存储在堆上。lots_of_bytes
,而不是整个结构。这意味着bar
和baz
将被放置在堆栈中,因此您可以减少间接。至于第二种选择,我无法想出任何理由更喜欢它,而且从未在野外见过它。