自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Rust模式:使用Box::leak創(chuàng)建一個&'static引用

開發(fā) 前端
代碼仍然與我們的原始代碼非常相似,但是現在我們的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指針,這樣我們的結構就可以在線程之間發(fā)送:

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個字節(jié)。

是否能做得更好呢?對于在程序的整個生命周期中都是不可變的數據,最好使用&'static引用。

但是如何創(chuàng)建&'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開發(fā)軟件

2015-04-20 10:06:37

PHP Rust 創(chuàng)建PHP 擴展

2023-12-11 11:56:24

圖片服務器Rust

2012-04-19 17:42:46

Titanium布局

2024-06-07 08:59:35

2025-02-27 00:00:15

2023-04-18 08:14:27

ElixirRustWebRTC

2023-11-03 11:57:04

2019-09-23 15:06:29

JavaScipio ERP在線商店

2009-07-23 16:21:07

static變量ASP.NET

2021-05-30 07:59:00

String引用類型

2016-03-08 09:52:22

xcode插件開發(fā)

2024-02-27 07:33:32

搜索引擎Rust模型

2022-04-10 23:02:08

GoRust語言

2018-04-27 16:00:15

Windows上帝模式

2021-07-06 14:36:05

RustLinux內核模塊

2021-01-03 16:30:34

Rust編程語言

2024-04-01 08:18:52

CSSHTMLWeb

2019-07-16 16:05:51

PythonScribusRGB

2020-09-01 20:53:26

DocsifyGitHub Page文檔網站
點贊
收藏

51CTO技術棧公眾號