当前位置:首页 > 科技  > 软件

Rust模式:使用Box::leak创建一个&'static引用

来源: 责编: 时间:2024-07-10 17:58:46 890观看
导读假设你有这个Config结构体,它在程序启动时加载一次,然后在整个生命周期中都是不可变的。问题是,Config需要被程序的许多部分访问:struct UsersService { config: Config,}struct OrdersService { config: Config,}/

假设你有这个Config结构体,它在程序启动时加载一次,然后在整个生命周期中都是不可变的。6Fe28资讯网——每日最新资讯28at.com

问题是,Config需要被程序的许多部分访问:6Fe28资讯网——每日最新资讯28at.com

struct UsersService {    config: Config,}struct OrdersService {    config: Config,}// ...let config = config::load()?;let users_service = UsersService::new(config.clone());let orders_service = OrdersService::new(config.clone());

在上面的代码中,Config被嵌入到两个结构体中,这可能不是理想的,因为这两个结构体将随着Config的大小而增长,而它们可能只需要访问1或2个字段。6Fe28资讯网——每日最新资讯28at.com

一个好的选择是使用智能指针:Rc或Arc,这样我们就可以共享Config的引用。因为我们的程序是多线程的(就像现在的大多数程序一样),我们将使用Arc指针,这样我们的结构就可以在线程之间发送:6Fe28资讯网——每日最新资讯28at.com

struct UsersService {    config: Arc<Config>,}struct OrdersService {    config: Arc<Config>,}// ...let config = Arc::new(config::load()?);let users_service = UsersService::new(config.clone());let orders_service = OrdersService::new(config.clone());

这里,UsersService和OrdersService只嵌入了一个Arc指针,这只增加了8个字节。6Fe28资讯网——每日最新资讯28at.com

是否能做得更好呢?对于在程序的整个生命周期中都是不可变的数据,最好使用&'static引用。6Fe28资讯网——每日最新资讯28at.com

但是如何创建&'static引用的Config,在运行时加载?6Fe28资讯网——每日最新资讯28at.com

请使用Box::leak,它在堆上分配内部结构体(这里是Config),并将引用“泄漏”到'static的生命周期。6Fe28资讯网——每日最新资讯28at.com

struct UsersService {    config: Arc<Config>,}struct OrdersService {    config: Arc<Config>,}// ...let config = Arc::new(config::load()?);let users_service = UsersService::new(config.clone());let orders_service = OrdersService::new(config.clone());

代码仍然与我们的原始代码非常相似,但是现在我们的UsersService和OrdersService只嵌入一个指针大小的引用,并且运行时开销正好为0。6Fe28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-100192-0.htmlRust模式:使用Box::leak创建一个&amp;'static引用

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Stream很好,Map很酷,但答应我别用toMap()

下一篇: Vue3 中异步接口请求是放在组件内部,还是放在Pinia中?

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
Top