#unsized #box #trait-object #alloc #no-alloc

no-std objectionable

在分配对象内部内联存储无尺寸类型

6 个版本

新版本 0.3.1 2024 年 8 月 23 日
0.3.0 2024 年 8 月 23 日
0.2.4 2024 年 8 月 23 日
0.1.0 2024 年 8 月 3 日

#829Rust 模式

Download history 234/week @ 2024-08-02 15/week @ 2024-08-09

每月 249 次下载

MIT/Apache

31KB
415

在分配对象内部内联存储 ?Sized 类型。

查看文档以获取用法和示例。

许可证

此存储库中的所有内容都根据您的要求,在以下两种许可证下双授权

除非明确说明,否则默认选择。


lib.rs:

在分配对象内部内联存储 ?Sized 类型。

查看 BigBoxInlineBox 以获取该软件包的主要接口。

正确性与内存模型

当启用 strict-provenance 软件包功能时,此软件包使用不稳定 API[^1] 在 实验性严格来源内存模型 下进行正确执行,并支持在 Miri 下通过测试套件。

当此功能禁用时,此软件包尝试仅使用稳定 Rust 中可用的 API 来复制不稳定的方法。此方法在实际环境中的编译是可靠的,但在严格来源内存模型下被认为是不可靠的。这不应影响典型用例(截至 Rust 1.80),但当与严格来源交互时,需要上述功能

请注意,此项目是一个爱好项目,并且未经正式验证。在未经测试的边缘情况中可能存在未发现的不可靠性。欢迎提交 问题PR

[^1]:特别地,Rust的strict_provenanceptr_metadata功能已被启用。

示例

// we define the trait object (and impls) which our `BigBox` will contain.
trait Character {
    fn personality(&self) -> &'static str;
}

impl Character for u8 {
    fn personality(&self) -> &'static str {
        "very small"
    }
}

impl Character for [u8; 1000] {
    fn personality(&self) -> &'static str {
        "enormous"
    }
}

// implementing the unsafe trait `FromSized` is necessary for creating `BigBox` values,
// but there is thankfully a safe macro for this:
objectionable::impl_from_sized_for_trait_object!(dyn Character);

// to use `BigBox`, we have to configure it with an internal type and maximum inline size:
type MyBox = objectionable::BigBox<dyn Character, 32>;

// if we have a pre-allocated value, we can use `BigBox::new_boxed` to create a `BigBox` value:
let pre_boxed = Box::new(5_u8);
let pre_boxed = MyBox::new_boxed(pre_boxed);

// alternatively, we can use `BigBox::new` which will store the value inline if it is small enough:
let inline = MyBox::new(2_u8);
assert!(inline.is_inline() == true);

// but if the value is too large, it will be allocated on the heap via a standard `Box`:
let boxed = MyBox::new([2u8; 1000]);
assert!(boxed.is_inline() == false);

// accessing values is easy:
assert_eq!(Character::personality(pre_boxed.as_ref()), "very small");
assert_eq!(Character::personality(inline.as_ref()), "very small");
assert_eq!(Character::personality(boxed.as_ref()), "enormous");

依赖项

~175KB