带有 Vec<i32> 和 Option<i32> 的结构体如何存储在内存中?

问题描述 投票:0回答:1

在程序中,定义了以下数据结构:

struct Bucket {
    data: Vec<i32>,
    threshold: Option<i32>,
}

使用调试器,已确定对于

Bucket
的实例,它存储在地址0x00006000014ed2c0处。观察该地址处的内存,显示以下内容(以32位块为单位):

308a6e01 00600000 03000000 00000000 03000000 00000000 01000000 0a000000

可以从单个实例的各个字段中包含的值推断出什么?

我发现前 24 个字节是指向第一个

i32
元素的指针、容量和长度。我不明白其余的块。

rust memory memory-management
1个回答
2
投票

Rust 很少保证事物在内存中的布局方式,但在这里我们可以很有把握地进行推测。

前 24 个字节确实是指向

i32
数组的开头、长度和容量的指针。

剩下的 8 个字节是

Option<i32>
。该类型有 2^32 + 1 个不同的值(2^32 个某些值和 1 个无值),它至少需要 33 位。 因为 i32 可能必须与系统上的 4 字节边界对齐,所以 Rust 使用 4 字节来存储
Option
Some
None

Rust 保证的一件事是

Option<&i32>
&i32
(指针大小)具有相同的大小,因为引用不能为零,并且我们可以使用 0 位模式来表示
None
。同样的事情不能应用于
Option<i32>

© www.soinside.com 2019 - 2024. All rights reserved.