#stack-overflow #box #heap #initialization #array #first #box-t

no-std boxify

直接在堆上放置您的值,无需先在栈上创建它们

1 个不稳定版本

0.1.0 2024 年 2 月 6 日

#453内存管理

MIT 许可证

10KB
104 代码行

boxify

这个crate提供了一个宏,用于在堆上初始化您的 Box<T>,而无需在栈上先创建它。这使得可以将大数组或包含它们的结构体轻松地放入 Box 中,而不会溢出栈

// this would overflow the stack:
// let e = Box::new(Example {
//     huge_array: [42; 1024 * 1024 * 1024],
// });

// this does not:
let e = boxify::boxify!(Example {
    huge_array: [42; 1024 * 1024 * 1024],
});

支持的类型

目前,这支持元组、数组和结构体,甚至深层嵌套的。请查看 examples 文件夹以了解可以实现什么。所有其他类型都将在栈上构建,稍后放入盒中。

已知限制

  • 枚举不受支持,并且由于它们在内存中的布局没有完全指定,因此永远不会完全支持。
  • 仅完全支持 小写 函数名调用和 大写 元组结构体实例化。
    这个限制是必要的,因为没有方法可以确定某物是函数调用还是元组结构体实例化,并且两者必须以不同的方式处理,因此这个crate仅使用命名作为启发式方法。如果宏遇到预期为结构体的函数,则会引发编译器错误,以防止不稳定性。小写元组结构体实例化将默默地分配在栈上,并将其移动到堆上。
  • 结构体更新语法,即 Test { ..test } 不允许并导致编译器错误。这是因为宏需要知道所有结构体字段才能填充它们。

依赖关系

~0.5–1MB
~22K SLoC