Rust 为什么比C安全,请看数据类型对比

基本数据类型

在基本数据类型方面,Rust的定义更加简单命令,各类型所占空间大小都一目了然,除isize/usize依赖于处理器平台位数外,其他类型的大小都是确定的

对于C来说,int是核心的数据类型,但不同平台的处理器位数大小也不一样,则int的大小也不一样,如8位机和32位机的int类型大小则不一样。因此C语言中的大部分数据类型都是不可确定的,需要依赖一些额外的头文件去确定数据类型大小。

bool类型上,Rust自带bool类型,C则没有,通常需要在头文件或自己定义bool类型,因此在不同的代码中可能bool的truefalse可能不一样。另外字符类型中,Rust的字符则是Unicode 的大小, 占用四个字节,C则占用一个字节,但是不同编译器规定的char类型可能是带符号或不带符号的类型,因此范围也不可直接确定。

自定义类型

结构体

RustC的结构体定义大致相同,但Rust更加精确。有以下区别

  1. 支持数据类型的权限访问定义,默认为私有类型
  2. 成员顺序可能改变,可节省空间,但也可强制保持与定义相同,并保留字节对齐
  3. 支持模板
  4. 支持零大小定义
  5. 支持定制实现方法
  6. 支持宏扩展

#[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中有着非常重要的角色,如ResultOption枚举让Rust代码处理逻辑更加安全.。

  1. 枚举可包裹其他数据
  2. 支持模板
  3. 支持转换成数字
  4. 支持零大小
  5. 支持访问权限控制
  6. 支持宏自动实现方法
pub enum Rule {       // 标记类型,不能转换成数字       
    Master,    
    Slave,    
}
#[derive(PartialEq)]   // 使用宏实现比较的方法         
pub(crateenum 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++几乎一致。






请使用浏览器的分享功能分享到微信等