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

开发 前端
代码仍然与我们的原始代码非常相似,但是现在我们的UsersService和OrdersService只嵌入一个指针大小的引用,并且运行时开销正好为0。​

假设你有这个Config结构体,它在程序启动时加载一次,然后在整个生命周期中都是不可变的。

问题是,Config需要被程序的许多部分访问:

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个字段。

一个好的选择是使用智能指针:Rc或Arc,这样我们就可以共享Config的引用。因为我们的程序是多线程的(就像现在的大多数程序一样),我们将使用Arc指针,这样我们的结构就可以在线程之间发送:

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个字节。

是否能做得更好呢?对于在程序的整个生命周期中都是不可变的数据,最好使用&'static引用。

但是如何创建&'static引用的Config,在运行时加载?

请使用Box::leak,它在堆上分配内部结构体(这里是Config),并将引用“泄漏”到'static的生命周期。

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。

责任编辑:武晓燕 来源: coding到灯火阑珊
相关推荐

2023-07-11 13:34:19

Rust开发软件

2015-04-20 10:06:37

PHP Rust 创建PHP 扩展

2023-12-11 11:56:24

图片服务器Rust

2012-04-19 17:42:46

Titanium布局

2024-06-07 08:59:35

2023-11-03 11:57:04

2019-09-23 15:06:29

JavaScipio ERP在线商店

2023-04-18 08:14:27

ElixirRustWebRTC

2021-05-30 07:59:00

String引用类型

2009-07-23 16:21:07

static变量ASP.NET

2016-03-08 09:52:22

xcode插件开发

2024-02-27 07:33:32

搜索引擎Rust模型

2022-04-10 23:02:08

GoRust语言

2019-07-16 16:05:51

PythonScribusRGB

2020-09-01 20:53:26

DocsifyGitHub Page文档网站

2018-04-27 16:00:15

Windows上帝模式

2024-04-01 08:18:52

CSSHTMLWeb

2021-01-03 16:30:34

Rust编程语言

2021-07-06 14:36:05

RustLinux内核模块

2009-08-19 04:14:00

线性链表
点赞
收藏

51CTO技术栈公众号