在静态变量中缓存外部加载的数据
Caching externally-loaded data in a static variable
我想从文件加载数据,然后将此数据(包括相当大的数组)缓存在静态变量中。这显然不是这样做的首选方式,但是:
- 我正在编写一个由 C(++) 程序调用的 Rust 库,目前没有任何对象超过 Rust 函数的实时调用。使用 static 可以避免我破解 C 代码。
- 该程序不会在内部并发执行任何操作,因此同步不是问题。
如何在 Rust 中完成此操作?
我发现 lazy-static 解决了类似的问题,但仅适用于不需要外部资源的代码(即理论上可以在编译时评估的项目)。
您不能在程序启动时进行初始化,但可以在第一次方法调用时进行。所有进一步的调用都将访问缓存的值,而不是重新计算您的值。
由于 Rust 禁止在静态变量中使用析构函数,因此您需要进行自己的清理管理。从逻辑上讲,这意味着您需要不安全的代码来破坏 Rust 的安全系统。以下示例使用 static mut
变量来缓存堆分配的对象(在本例中为 i32
)。
cacheload 函数像单例一样工作。
记得在完成后从 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);
}
我想从文件加载数据,然后将此数据(包括相当大的数组)缓存在静态变量中。这显然不是这样做的首选方式,但是:
- 我正在编写一个由 C(++) 程序调用的 Rust 库,目前没有任何对象超过 Rust 函数的实时调用。使用 static 可以避免我破解 C 代码。
- 该程序不会在内部并发执行任何操作,因此同步不是问题。
如何在 Rust 中完成此操作?
我发现 lazy-static 解决了类似的问题,但仅适用于不需要外部资源的代码(即理论上可以在编译时评估的项目)。
您不能在程序启动时进行初始化,但可以在第一次方法调用时进行。所有进一步的调用都将访问缓存的值,而不是重新计算您的值。
由于 Rust 禁止在静态变量中使用析构函数,因此您需要进行自己的清理管理。从逻辑上讲,这意味着您需要不安全的代码来破坏 Rust 的安全系统。以下示例使用 static mut
变量来缓存堆分配的对象(在本例中为 i32
)。
cacheload 函数像单例一样工作。
记得在完成后从 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);
}