一篇学会 Rust 内存布局


一篇学会 Rust 内存布局

文章插图
整型,浮点型,struct,vec!,enum 本文是对 Rust内存布局[1] 的学习与记录
 struct A {    a: i64,    b: u64,}struct B {    a: i32,    b: u64,}struct C {    a: i64,    b: u64,    c: i32,}struct D {    a: i32,    b: u64,    c: i32,    d: u64,}fn mAIn() {    println!("i32类型占的内存空间为:{}字节", std::mem::size_of::<i32>());    println!("i64类型占的内存空间为:{}字节", std::mem::size_of::<i64>());    println!(        "[i64;4]占的内存空间为:{}字节",        std::mem::size_of::<[i64; 4]>()    );    println!("结构体A占的内存空间为:{}字节", std::mem::size_of::<A>());    println!("结构体B占的内存空间为:{}字节", std::mem::size_of::<B>());    println!("结构体C占的内存空间为:{}字节", std::mem::size_of::<C>());    println!("结构体D占的内存空间为:{}字节", std::mem::size_of::<D>());}输出
i32类型占的内存空间为:4字节i64类型占的内存空间为:8字节[i64;4]占的内存空间为:32字节结构体A占的内存空间为:16字节结构体B占的内存空间为:16字节结构体C占的内存空间为:24字节结构体D占的内存空间为:24字节没啥好说的,和Go一样,struct会存在内存对齐/内存填充(8字节对齐)
D是因为编译器会优化内存布局,字段顺序重排

Rust中的Vec!和Go中的slice差不多,都是占24Byte,三个字段
struct SimpleVec<T> {    len: usize,      // 8    capacity: usize, //8    data: *mut T,    //8}fn main() {    println!(        "Vec!类型占的内存空间为:{}字节",        std::mem::size_of::<SimpleVec<i32>>()    );    println!(        "Option<i64>类型占的内存空间为:{}字节",        std::mem::size_of::<Option<i64>>()    );}Vec!类型占的内存空间为:24字节Option<i64>类型占的内存空间为:16字节但是对于enum类型,
【一篇学会 Rust 内存布局】会有一个tag字段,uint64,来标记变体,是None值还是Some值
struct Option {    uint64 tag; // 占8字节 Some None    i64; //实际存放的数据} struct SimpleVec<T> {    len: usize,      // 8    capacity: usize, //8    data: *mut T,    //8}enum Data {    // tag,uint64,8字节    I32(i32),             //  4字节,但需内存对齐到8字节?    F64(f64),             // 8字节    Bytes(SimpleVec<u8>), // 24字节}fn main() {    println!(        "Data这个Enum类型占的内存空间为:{}字节",        std::mem::size_of::<Data>()    );}输出为:
Data这个Enum类型占的内存空间为:32字节
 Rust的enum类似C++ std::variant的实现(大致是用union实现的)
union的内存大小是其成员中最大的那个成员的大小,
类似的,对于Data这个Enum类型,会选择最大的那个成员的大小
所以24+tag的8字节,最终为32字节 (tag在这里就用来标识其为i32,还是f64,或者是Vec)
 嵌套的枚举:
struct SimpleVec<T> {    len: usize,      // 8    capacity: usize, //8    data: *mut T,    //8}enum Data {    // tag,uint64,8字节    I32(i32),             //  4字节,但需内存对齐到8字节?    F64(f64),             // 8字节    Bytes(SimpleVec<u8>), // 24字节}type OptData = Option<Data>;fn main() {    println!(        "OptData这个Option类型占的内存空间为:{}字节",        std::mem::size_of::<OptData>()    );}


推荐阅读