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

struct Foo {
    lots_of_bytes: [u8; 1024 * 10],
    bar: bool,
    baz: isize,
}

有两个显而易见的解决方案:

let foo = Box::new(Foo::new());

Or

struct Foo {
    lots_of_bytes: Box<[u8; 1024 * 10]>,
    bar: bool,
    baz: isize,
}

总之,我要么在堆上分配整个 struct ,要么让该 struct 拥有堆指针.这两种解决方案中有一种被认为是"惯用"的解决方案吗?或者它是严格主观的还是依赖于上下文?

推荐答案

我想在这里要问你自己的问题是:如果答案是否定的,你可能应该在堆上强制分配.要实现这一点,您有两种 Select :

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

在我看来,第一种 Select 要好得多:

  • Foo的 struct 定义清楚地表明数据必须存储在堆上.
  • 这只需要装箱lots_of_bytes,而不是整个 struct .这意味着barbaz将被放置在堆栈上,因此间接寻址更少.

至于第二种 Select ,我想不出任何理由喜欢它,也从未在野外见过它.

Rust相关问答推荐

在不重写/专门化整个函数的情况下添加单个匹配手臂到特征的方法?

为什么允许我们将可变引用转换为不可变引用?

有没有办法在Rust中配置常量变量的值?

无法从流中读取Redis请求

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

Gtk4-rs:将监视器作为gdk::monitor获取,而不是作为glib::对象获取

Trait bound i8:来自u8的不满意

铁 rust 中双倍或更多换行符的更好练习?

Rust wasm 中的 Closure::new 和 Closure::wrap 有什么区别

为什么在 Allocator API 中 allocate() 使用 `[u8]` 而 deallocate 使用 `u8` ?

tokio::sync::broadcast::Receiver 不是克隆

Rust并发读写引起的死锁问题

Rust中的位移操作对范围有什么影响?

如何在 Rust 中编写涉及异步的重试函数

为实现特征的所有类型实现显示

使用 `.` 将 T 转换为 &mut T?

有没有办法隐藏类型定义?

您如何使用枚举反序列化字符串,其中任何其他值反序列化为新类型变体同时保留字符串?

如何从 Cargo.toml 强制 --document-private-items?

Rust String AsRef 不会自动borrow [u8]