2 个版本
0.1.1 | 2023年7月13日 |
---|---|
0.1.0 | 2023年7月13日 |
#481 in 内存管理
19KB
187 行
可派生对象池
此crate提供了一个可以通过一行代码派生的特质,以实现类型对象的池。使用户能够忘记ObjectPool
的实现细节,专注于代码的重要部分
与其他对象池crate相比,此crate有以下特点
- 可派生:池子易于使用,可以与任何类型一起使用。可以使用
#[derive(ObjectPool)]
属性宏进行派生。 - 可复用:用户可以使用
ObjectPool::new
函数从池中创建对象,如果可能的话,将复用池中的对象。这些项目将包装在Reusable
结构中,当它们被丢弃时将返回池中。 - 线程安全:池是线程安全的(通过使用
Mutex
),可以在多线程环境中使用。 - 简单:用户不需要为每个类型手动创建池,可以使用
ObjectPool::new
函数从池中创建对象。 - 灵活:用户可以配置池以使用自定义的生成函数(见
#[derive(ObjectPool)]
中的属性)或者直接使用Default
特质来创建新对象。
安装
将以下内容添加到您的Cargo.toml
文件中
[dependencies]
derivable-object-pool = "0.1.1"
使用
未指定任何属性时,池将使用Default
特质来创建新对象
use derivable_object_pool::prelude::*;
#[derive(Default, ObjectPool)]
struct Test(i32);
fn main() {
let mut obj = Test::new();
obj.0 += 1;
assert_eq!(obj.0, 1);
drop(obj); // obj is returned to the pool
assert_eq!(Test::pool().len(), 1);
let mut obj = Test::new();
assert_eq!(Test::pool().len(), 0);
assert_eq!(obj.0, 1);
}
或者您可以使用#[generator]
属性指定一个自定义的生成函数
use derivable_object_pool::prelude::*;
#[derive(ObjectPool)]
#[generator(Test::new_item)]
struct Test(i32);
impl Test {
fn new_item() -> Self {
Test(10)
}
}
fn main() {
let mut obj = Test::new();
obj.0 += 1;
assert_eq!(obj.0, 11);
drop(obj); // obj is returned to the pool
assert_eq!(Test::pool().len(), 1);
let mut obj = Test::new();
assert_eq!(Test::pool().len(), 0);
assert_eq!(obj.0, 11);
}
文档
文档可以在这里找到。
许可证
本项目受双MIT/Apache-2.0许可证许可。更多信息,请参阅LICENSE-APACHE和LICENSE-MIT。
依赖关系
~280–730KB
~17K SLoC