基本数据类型
在基本数据类型方面,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更加精确。有以下区别
支持数据类型的权限访问定义,默认为私有类型 成员顺序可能改变,可节省空间,但也可强制保持与定义相同,并保留字节对齐 支持模板 支持零大小定义 支持定制实现方法 支持宏扩展
#[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++几乎一致。