首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在静态变量中缓存外部加载的数据。

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

Stack Overflow用户
提问于 2015-01-28 10:40:48
回答 1查看 397关注 0票数 2

我想从一个文件中加载数据,然后将这些数据(包括相当大的数组)缓存到一个静态变量中。显然,这不是首选的做法,但:

  1. 我正在编写一个由C(++)程序调用的Rust库,目前没有任何对象可以在外部调用Rust函数。使用静态可以避免我不得不黑掉C代码。
  2. 程序不会在内部并发执行任何事情,因此同步不是问题。

怎样才能在锈病中做到这一点?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-28 13:04:35

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

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

只需记住在完成之后从c调用cachefree()即可。

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28190153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档