“常量”和“靜態(tài)”

2018-08-12 22:03 更新

“常量”和“靜態(tài)”

Rust 有用 const 關(guān)鍵字定義常量的方法:

const N: i32 = 5;

不像 let 綁定那樣,您必須標(biāo)注常量的類型。

常量活在程序的整個(gè)生命周期。更具體地說,在 Rust 語言里面常量沒有固定內(nèi)存地址。這是因?yàn)樗麄儠?huì)被有效的內(nèi)聯(lián)到每個(gè)使用地方。引用相同的常數(shù)并不一定保證引用同一個(gè)內(nèi)存地址也是因?yàn)檫@個(gè)原因。

靜態(tài)

Rust 在靜態(tài)條目中提供一種“全局變量”。它們類似于常量,但靜態(tài)條目不內(nèi)聯(lián)使用。這意味著每個(gè)值只對(duì)應(yīng)一個(gè)實(shí)例, 并且在內(nèi)存中只有一個(gè)固定的地址。

這里有一個(gè)例子:

static N: i32 = 5;

不像 let 綁定那樣,您必須標(biāo)注一個(gè)靜態(tài)的類型。

靜態(tài)類型活在程序的整個(gè)生命周期,因此任何存儲(chǔ)在常量中的引用都有“靜態(tài)生命周期:

static NAME: &'static str = "Steve";

可變性

你可以用 mut 關(guān)鍵字介紹可變性:

static mut N: i32 = 5;

因?yàn)檫@是可變的,一個(gè)線程正在更新 N,而此時(shí)另一個(gè)正在讀入它,這樣會(huì)導(dǎo)致內(nèi)存不安全。這樣訪問和改變一個(gè)靜態(tài) mut 是不安全的,所以必須在一個(gè)unsafe 的塊里面完成:

unsafe {
N += 1;

println!("N: {}", N);
}

此外,任何存儲(chǔ)在 static 的類型都必須是 Sync。

初始化

常量和靜態(tài)常量都要求給他們一個(gè)值。并且他們可能只被賦予一個(gè)值,這個(gè)值是一個(gè)常數(shù)表達(dá)式。換句話說,在程序運(yùn)行時(shí),您不能使用函數(shù)調(diào)用的結(jié)果或任何其他類似的復(fù)雜操作。

我應(yīng)該使用哪個(gè)構(gòu)造?

幾乎總是如此,如果你能在兩者之間選擇,那么就選擇常量。人們幾乎不怎么希望內(nèi)存地址與你的常量關(guān)聯(lián)到一起,并且允許對(duì)常量進(jìn)行優(yōu)化,就像常量的使用范圍不僅在本程序塊也在下游程序塊一樣。

常量可以被認(rèn)為是在 C 語 言中用 # define 定義的:這里會(huì)有元數(shù)據(jù)開銷,但沒有運(yùn)行開銷?!霸?C 語言中,我應(yīng)該使用 # define 還是 static,“很大程度與這個(gè)問題是相同的,“在 Rus t語言中,我是應(yīng)該使用 const 還是 static”。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)