7个版本
使用旧Rust 2015
0.1.6 | 2019年4月24日 |
---|---|
0.1.5 | 2018年6月26日 |
0.1.4 | 2018年5月16日 |
0.1.1 | 2018年4月19日 |
#377 in 内存管理
27 每月下载量
35KB
277 行
boxext
对 Box
类型的扩展
此crate为Box
提供额外的初始化方法,以解决当前(截至编写时)Box::new
的不足。
-
自Rust 1.12以来,如
Box::new([0; 4096])
这样的构造首先在栈上创建一个临时对象,然后再将其复制到新分配的空间中(例如,问题 #50047)。 -
如
Box::new(some_function_call())
这样的构造首先从栈上的函数调用中获取结果,然后再将其复制到新分配的空间中。
这两种情况都可以通过一些曲折的方式解决,但有一些注意事项。此crate提供了一些助手来执行这些曲折,但不能处理这些注意事项。这些注意事项本质上与为什么不稳定放置功能在nightly 1.27中被移除的原因相同,即没有保证事情真的会在原地发生(在调试构建中它们确实不会发生)。
此crate为Box
类型添加以下助手方法
-
new_with
,它接受一个返回将被放置在Box中的对象的函数或闭包。 -
new_zeroed
,用于创建一个填充零的对象,可能使用calloc
/HeapAlloc(..., HEAP_ZERO_MEMORY, ...)
/mallocx(..., MALLOCX_ZERO)
在底层。 -
try_new
、try_new_with
和try_new_zeroed
,它们与new
、new_with
和new_zeroed
相同,但在分配失败时不会panic。
示例
extern crate boxext;
use boxext::BoxExt;
struct Foo(usize, usize);
impl Foo {
fn new(a: usize, b: usize) -> Self {
Foo(a, b)
}
}
impl Default for Foo {
fn default() -> Self {
Foo::new(0, 1)
}
}
fn main() {
// equivalent to `Box::new(Foo(1, 2))`
let buf = Box::new_with(|| Foo(1, 2));
// equivalent to `Box::new(Foo::new(2, 3))`
let buf = Box::new_with(|| Foo::new(2, 3));
// equivalent to `Box::new(Foo::default())`
let buf = Box::new_with(Foo::default);
// equivalent to `Box::new([0usize; 64])`
let buf: Box<[usize; 64]> = Box::new_zeroed();
}
功能
-
std
(默认启用):使用 libstd。可以通过禁用它来允许与no_std
代码一起使用,在这种情况下需要启用allocator_api
。 -
allocator_api
:向Box
类型添加类似助手,来自allocator_api
包。
许可证:Apache-2.0/MIT
依赖项
~24KB