一篇学会 Rust 内存布局( 二 )

输出:
OptData这个Option类型占的内存空间为:32字节
因为编译器会对嵌套的枚举类型进行优化,会将其tag展开, 把多个tag合在一起了,类似下面:
展开变成一个枚举(None是uint64,能标识非常多信息)
type OptData = Option<Data>;enum Option {    Some,    None,}enum OptData_ {    I32(i32);    F64(f64);    Bytes(SimpleVec<u8>),    None} 元组tuple rust中的元组大小固定吗?
在Rust中,元组的大小是固定的 。这里解释一下元组大小固定的含义:

  • 元组中的元素类型和数量在编译期就已经确定,不能在运行期修改 。
  • 编译器会根据元组中元素的类型,预先分配足够的内存用于存储这些元素 。
  • 元组的内存布局和大小也在编译期就确定下来了,运行期不会改变 。
  • 尝试创建包含不同类型或数量元素的元组,是编译时错误 。
举个例子:
let tuple = (1, 2.0, "three");这里元组包含一个i32,一个f64和一个字符串 。编译器会预先知道:
  • 元组元素类型为i32, f64, &str
  • i32占用4字节,f64占用8字节,&str占据一个指针的空间
  • 所以该元组占用的内存大小为4 + 8 + 8 = 20字节
这20字节的内存在编译时就已分配,运行期不会改变 。
如果后续试图给这个元组添加或减少元素,编译都会报错 。
所以说,元组的大小和内容是固定的,这是Rust实现方式的一部分 。

更多可参考Rust 数据内存布局[2]
参考资料[1]Rust内存布局: 


推荐阅读