在基本數(shù)據(jù)類型方面,Rust的定義更加簡單命令,各類型所占空間大小都一目了然,除isize/usize依賴于處理器平臺位數(shù)外,其他類型的大小都是確定的
對于C來說,int
是核心的數(shù)據(jù)類型,但不同平臺的處理器位數(shù)大小也不一樣,則int
的大小也不一樣,如8位機(jī)和32位機(jī)的int類型大小則不一樣。因此C語言中的大部分?jǐn)?shù)據(jù)類型都是不可確定的,需要依賴一些額外的頭文件去確定數(shù)據(jù)類型大小。
在bool
類型上,Rust
自帶bool
類型,C
則沒有,通常需要在頭文件或自己定義bool類型,因此在不同的代碼中可能bool的true
和false
可能不一樣。另外字符類型中,Rust的字符則是Unicode
的大小, 占用四個字節(jié),C則占用一個字節(jié),但是不同編譯器規(guī)定的char
類型可能是帶符號或不帶符號的類型,因此范圍也不可直接確定。
Rust 基本數(shù)據(jù)類型
C基礎(chǔ)數(shù)據(jù)類型
自定義類型
結(jié)構(gòu)體
Rust
和C
的結(jié)構(gòu)體定義大致相同,但Rust更加精確。有以下區(qū)別
- 支持?jǐn)?shù)據(jù)類型的權(quán)限訪問定義,默認(rèn)為私有類型
- 成員順序可能改變,可節(jié)省空間,但也可強(qiáng)制保持與定義相同,并保留字節(jié)對齊
- 支持模板
- 支持零大小定義
- 支持定制實(shí)現(xiàn)方法
- 支持宏擴(kuò)展
#[derive(PartialEq)] // 使用宏自動實(shí)現(xiàn)比較的方法
pub struct Language{
pub name: String, // public 屬性
id: u32 // 私有屬性
}
// 零大小結(jié)構(gòu)體
struct C;
// 模板結(jié)構(gòu)體
pub struct AnyAdc<'d, T: Instance, M: Mode> {
t: PhantomData<&'d T>,
_m: PhantomData,
}
枚舉
Rust的枚舉與C最大的不同是,Rust更加規(guī)范,枚舉可為數(shù)字,也可為匿名標(biāo)記,C則可強(qiáng)制轉(zhuǎn)換成整數(shù)類型。枚舉在Rust中有著非常重要的角色,如Result
,Option
枚舉讓Rust
代碼處理邏輯更加安全.。
- 枚舉可包裹其他數(shù)據(jù)
- 支持模板
- 支持轉(zhuǎn)換成數(shù)字
- 支持零大小
- 支持訪問權(quán)限控制
- 支持宏自動實(shí)現(xiàn)方法
pub enum Rule { // 標(biāo)記類型,不能轉(zhuǎn)換成數(shù)字
Master,
Slave,
}
#[derive(PartialEq)] // 使用宏實(shí)現(xiàn)比較的方法
pub(crate) enum Id { // 只在crate中訪問,外部不可訪問
Rtc1 = 0, // 可轉(zhuǎn)換成數(shù)字
}
enum Config; // 零大小枚舉
enum Mode { // 模板類
Mode1(T)
Mode2
}
聯(lián)合體
Rust并不提倡大量使用聯(lián)合體,但為了兼容C的數(shù)據(jù)類型,也實(shí)現(xiàn)了聯(lián)合體的功能,在訪問時強(qiáng)制標(biāo)記unsafe
域。在內(nèi)部成員的引用方式則與C幾乎一致。
#[repr(C)]
union MyUnion {
f1: u32,
f2: f32,
}
總結(jié)
通過以上對比,可感受到Rust
在數(shù)據(jù)類型方面的設(shè)計更加嚴(yán)謹(jǐn)和安全,同時也更加靈活,且移植性更強(qiáng)。同時也最大限度得兼容了C數(shù)據(jù)類型的所有特性。另外Rust
的各種數(shù)據(jù)類型,其實(shí)也是對象,可使用一些Rust提供的方法來實(shí)現(xiàn)操作,讓開發(fā)者使用起來如Python一樣簡單,同時運(yùn)行效率與C/C++幾乎一致。