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