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

w.b*_*ian 6 rust

我有一个类型占用太多空间来分配堆栈:

struct Foo {
    lots_of_bytes: [u8; 1024 * 10],
    bar: bool,
    baz: isize,
}
Run Code Online (Sandbox Code Playgroud)

有两个明显的解决方案:

let foo = Box::new(Foo::new());
Run Code Online (Sandbox Code Playgroud)

要么

struct Foo {
    lots_of_bytes: Box<[u8; 1024 * 10]>,
    bar: bool,
    baz: isize,
}
Run Code Online (Sandbox Code Playgroud)

总而言之,我要么在堆上分配整个结构,要么我可以让结构拥有堆指针.这些解决方案中的任何一个都被认为是"惯用"解决方案吗?或者它是严格主观的还是依赖于背景?

aoc*_*via 6

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

  1. 使用lots_of_bytes: Box<[u8; 1024 * 10]>.
  2. 使用lots_of_bytes: [u8; 1024 * 10]并确保所有Foo返回的构造函数Box<Foo(因此无法Foo在堆栈上创建).

在我看来,第一种选择更好:

  • 结构定义Foo清楚地表明数据必须存储在堆上.
  • 这只需要装箱lots_of_bytes,而不是整个结构.这意味着,barbaz将被放置在栈上,让你拥有更小的间接.

至于第二种选择,我想不出任何理由偏爱它,也从未在野外见过它.