含Vec<i32>与Option<i32>的结构体内存存储及字段值推断问题
Rust Bucket结构体实例内存解析
给定Rust结构体定义:
struct Bucket { data: Vec<i32>, threshold: Option<i32>, }
某Bucket实例存储于地址0x00006000014ed2c0,内存以32位块(每块4字节)展示如下:
308a6e01 00600000 03000000 00000000 03000000 00000000 01000000 0a000000
以下是各字段的解析(基于x86_64小端字节序):
1. data: Vec字段解析
x86_64平台下,Vec<T>由三个64位(8字节)字段组成,对应前24字节(6个32位块):
- 元素指针:由前两个32位块拼接而成。小端序下低地址存低字节,完整指针为
0x00600000016e8a30,指向堆上存储i32元素的起始地址。 - 容量(capacity):由第3、4个32位块组成,值为
0x0000000000000003,即十进制3,表示该Vec最多可容纳3个i32元素。 - 长度(length):由第5、6个32位块组成,值为
0x0000000000000003,即十进制3,表示当前Vec已存储3个i32元素。
2. threshold: Option字段解析
剩余8字节(第7、8个32位块)对应Option<i32>。Rust对Option<T>做了空指针优化:当T是Copy类型且大小不超过指针时,用高4字节标记变体(非0表示Some,全0表示None),低4字节存储值。
- 第8个32位块是
0a000000,小端序下对应i32值0x0000000a,即十进制10。 - 第7个32位块是
01000000,为非0值,说明是Some变体。 - 因此
threshold的值为Some(10)。
内容的提问来源于stack exchange,提问作者Mario Umberto Benea
相关产品推荐
相关产品推荐

