在静态变量中缓存外部加载的数据

时间:2015-01-28 10:40:48

标签: caching static rust ffi

我想从文件加载数据,然后将这些数据(包括非常大的数组)缓存在静态变量中。这显然不是这样做的首选方式,但是:

  1. 我正在编写一个由C(++)程序调用的Rust库,并且当前没有任何对象可以调用Rust函数。使用静态可以避免我不得不破解C代码。
  2. 程序不会在内部同时执行任何操作,因此同步不是问题。
  3. 如何在Rust中完成?

    我发现lazy-static解决了类似的问题,但只针对不需要外部资源的代码(即理论上可以在编译时评估的项目)。

1 个答案:

答案 0 :(得分:3)

您无法在程序启动时进行初始化,但您可以在第一次方法调用时执行此操作。所有进一步的调用都将访问缓存的值,而不是重新计算您的值。

由于rust禁止在静态变量中使用析构函数,因此需要进行自己的清理管理。从逻辑上讲,这意味着您需要使用不安全的代码来破坏生锈的安全系统。以下示例使用static mut变量来缓存堆分配的对象(在本例中为i32)。 缓存加载功能就像Singleton一样。

请记住在完成后从c调用cachefree()。​​

use std::{ptr, mem};

static mut cache: *const i32 = 0 as *const i32;

unsafe fn cacheload() -> i32 {
    if cache == ptr::null() {
        // do an expensive operation here
        cache = mem::transmute(Box::new(42));
    }
    return *cache;
}

unsafe fn cachefree() {
    if cache != ptr::null() {
        let temp: Box<i32> = mem::transmute(cache);
        cache = ptr::null();
        drop(temp);
    }
}

fn main() {
    let x;
    unsafe {
        x = cacheload();
        cachefree();
    }
    println!("{}" , x);
}