是在堆上分配一个结构还是一个结构拥有一个更加惯用的堆指针?

时间:2017-04-12 03:11:51

标签: rust

我有一个占用太多空间的类型要在堆栈上分配:

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;解?或者它是严格主观的还是依赖于背景?

1 个答案:

答案 0 :(得分:5)

我认为在这里问自己的问题是:将这个结构放在堆栈中是否有意义?如果答案是否定的,你应该在堆上强制执行分配。要实现这一目标,您有两种选择:

  1. 使用lots_of_bytes: Box<[u8; 1024 * 10]>
  2. 使用lots_of_bytes: [u8; 1024 * 10]并确保Foo的所有构造函数都返回Box<Foo(因此无法在堆栈上创建Foo
  3. 在我看来,第一种选择更好:

    • Foo的结构定义清楚地表明数据必须存储在堆上。
    • 这只需要装箱lots_of_bytes,而不是整个结构。这意味着barbaz将被放置在堆栈中,因此您可以减少间接。

    至于第二种选择,我无法想出任何理由更喜欢它,而且从未在野外见过它。