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 每月下载量

Apache-2.0/MIT

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类型添加以下助手方法

示例

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