文章插图
整型,浮点型,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>() );}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ARM架构下部署StarRocks3,你学会了吗?
- 深入Rust的模式匹配与枚举类型
- 王者荣耀:单排玩家上分学会这几要点,告别痛苦!
- Javascript的闭包有哪些应用?你学会了吗?
- Springboot扩展点之BeanDefinitionRegistryPostProcessor,你学会了吗?
- 程序员学会与大模型相处,提升个人开发效率
- 今天才发现,钞票上有个小玄机,看一眼能辨真伪,学会再也不吃亏
- 30+一定要学会做减法,我选择低物欲生活
- 如何用秀米快速写出一篇推文,在秀米编辑器怎么复制推文的链接
- 笔记本电脑如何打字,电脑新手如何快速学会打字