#memory #memory-pool #pool #allocate #recycle #cache #object

easy-pool

一种简单的方法,在不每次重新分配内存的情况下重用对象

12 个版本

0.2.7 2022年7月18日
0.2.6 2022年7月18日
0.1.3 2022年2月6日

#281 in 内存管理

42 每月下载量
用于 rollo

MIT 许可证

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);
}

重要知识点

  1. 池是完全线程安全的。

  2. 如果没有对象可用,create_with 函数将执行 FnOnce。如果有对象可用,池将检索对象并执行 clear () 函数。

  3. 如果没有对象可用,create () 函数将使用 default () 函数创建对象。如果有对象可用,池将检索对象并执行 clear () 函数。

依赖项

~1.7–8MB
~48K SLoC