12 个版本
0.2.7 | 2022年7月18日 |
---|---|
0.2.6 | 2022年7月18日 |
0.1.3 | 2022年2月6日 |
#281 in 内存管理
42 每月下载量
用于 rollo
16KB
362 行
[dependencies]
easy-pool = "0.2.7"
一种简单的方法,在不每次重新分配内存的情况下重用对象。
简单示例
use std::sync::Arc;
use easy_pool::{Clear, EasyPoolMutex, PoolMutex};
// It will create the pool and create the functions T::create_with & T::create.
// This derive is optional but you have to create the pool yourself.
// Like this : let pool = Arc::new(PoolMutex::with_config(1024, 1024));.
#[derive(EasyPoolMutex, Default)]
struct Test {
pets: Vec<String>,
}
impl Clear for Test {
fn clear(&mut self) {
self.pets.clear();
}
}
fn main() {
// Easiest way.
let mut test = Test::create_with(|| Test {
pets: Vec::with_capacity(100),
});
assert_eq!(test.pets.capacity(), 100);
test.pets.push("Cat".to_string());
assert_eq!(test.pets.first().unwrap(), "Cat");
test.pets.extend(vec!["Dog".to_string(); 100]);
assert_eq!(test.pets.len(), 101);
assert_eq!(test.pets.capacity(), 200);
drop(test);
// The function create will reuse the old "test".
let test = Test::create_with(|| Test {
pets: Vec::with_capacity(100),
});
assert_eq!(test.pets.len(), 0);
assert_eq!(test.pets.capacity(), 200);
// Or more complex.
let pool = Arc::new(PoolMutex::with_config(1024, 1024));
let result = pool.create_with(|| Test {
pets: Vec::with_capacity(100),
});
assert_eq!(result.pets.capacity(), 100);
}
重要知识点
-
池是完全线程安全的。
-
如果没有对象可用,create_with 函数将执行 FnOnce。如果有对象可用,池将检索对象并执行 clear () 函数。
-
如果没有对象可用,create () 函数将使用 default () 函数创建对象。如果有对象可用,池将检索对象并执行 clear () 函数。
依赖项
~1.7–8MB
~48K SLoC