You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中枚举变体(u32,u32)为何比u64占用空间更小且为12字节?

Rust枚举内存布局:12字节 vs 16字节的原因分析

问题背景

测试以下Rust枚举:

enum SizeEnum {
    V1(u32, u32),
    // V2(u64),
    V3(u32, u32),
}

fn main() {
    println!("{:?}", std::mem::size_of::<SizeEnum>()); // 输出12
}

取消注释V2(u64)后,size_of输出变为16字节。针对这一现象,解答如下:


1. 为何仅包含(u32, u32)变体的枚举比包含u64变体的枚举占用空间更小?

核心原因是枚举的对齐要求由其最大对齐的变体决定,对齐要求直接影响最终内存占用:

  • 当枚举仅包含(u32, u32)变体时:
    • (u32, u32)元组的大小为8字节,对齐要求是4字节(元组对齐取成员的最大对齐值,u32的对齐为4)。
    • Rust枚举需要1字节的判别式(用u8即可区分2种变体状态)来标识当前是哪个变体。
    • 原始总大小为8(变体数据) + 1(判别式) = 9字节,因对齐要求为4字节,需向上取整到4的最小整数倍,即12字节。
  • 加入V2(u64)变体后:
    • u64的对齐要求是8字节,因此整个枚举的对齐要求被提升为8字节。
    • 原始总大小仍为9字节,但需向上取整到8的最小整数倍,即16字节。

简言之,u64的高对齐要求强制枚举总大小必须是8的倍数,最终导致占用空间从12字节增加到16字节。


2. 为何占用空间是12字节而非9字节(72位)?

这完全是内存对齐填充的硬性要求:

  • 现代CPU对内存访问有对齐偏好(部分架构甚至要求严格对齐):访问地址为对齐值倍数的数据时,效率更高,可避免额外的内存拆分操作。
  • 仅包含(u32, u32)变体的枚举,对齐要求为4字节,因此枚举的大小必须是4的整数倍。
  • 原始9字节无法满足4字节对齐,编译器会自动填充3字节,使总大小达到12字节(4×3),确保枚举实例的起始地址始终是4的倍数。

注:填充字节的内容是未定义的,程序不应依赖这些值。


内容的提问来源于stack exchange,提问作者Daniel Fath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:50:23