1 个不稳定版本
0.1.0 | 2024 年 2 月 6 日 |
---|
#453 在 内存管理
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