6 个版本
新版本 0.3.1 | 2024 年 8 月 23 日 |
---|---|
0.3.0 | 2024 年 8 月 23 日 |
0.2.4 |
|
0.1.0 |
|
#829 在 Rust 模式
每月 249 次下载
31KB
415 行
在分配对象内部内联存储 ?Sized
类型。
查看文档以获取用法和示例。
许可证
此存储库中的所有内容都根据您的要求,在以下两种许可证下双授权
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
- Apache 许可证,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
除非明确说明,否则默认选择。
lib.rs
:
在分配对象内部内联存储 ?Sized
类型。
查看 BigBox
和 InlineBox
以获取该软件包的主要接口。
正确性与内存模型
当启用 strict-provenance
软件包功能时,此软件包使用不稳定 API[^1] 在 实验性严格来源内存模型 下进行正确执行,并支持在 Miri 下通过测试套件。
当此功能禁用时,此软件包尝试仅使用稳定 Rust 中可用的 API 来复制不稳定的方法。此方法在实际环境中的编译是可靠的,但在严格来源内存模型下被认为是不可靠的。这不应影响典型用例(截至 Rust 1.80),但当与严格来源交互时,需要上述功能。
请注意,此项目是一个爱好项目,并且未经正式验证。在未经测试的边缘情况中可能存在未发现的不可靠性。欢迎提交 问题 和 PR。
[^1]:特别地,Rust的strict_provenance
和ptr_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