反直觉的Rust内存分配疑问:为何仅boxed_num2分配在堆上?
Rust内存分配疑问解答
问题背景
编写了一个小型Rust程序验证内存分配,定义了栈上u8变量num、num2,预期堆分配的Box<u8>变量boxed_num、boxed_num2,以及String变量s。通过程序输出和/proc/maps查看,仅boxed_num2处于堆地址范围,其余变量均在栈上,多次运行结果一致。
原因分析
1. Box<u8>的栈上优化
Rust编译器会对**极小尺寸类型的Box<T>**做自动优化:当T的内存占用足够小(比如u8仅1字节),编译器会直接将值存储在栈上,避免极小对象堆分配带来的性能开销。
boxed_num被编译器触发了该优化,直接存在栈上;而boxed_num2可能因代码结构(比如变量的使用逻辑、编译器局部优化策略)未触发优化,因此真正在堆上分配了内存。
2. String的短字符串优化(SSO)
Rust标准库的String实现了短字符串优化(SSO):当字符串长度较短时(通常≤15字节,具体取决于平台),字符串内容会直接存在String结构体的栈上缓冲区里,不会向堆申请内存。这就是s的地址处于栈范围的原因。
3. 多次运行结果一致的原因
编译器的优化策略是稳定的,对于相同的代码结构会做出一致的优化决策,因此多次运行程序会得到相同的内存分配结果。
内容的提问来源于stack exchange,提问作者Arjun
相关产品推荐
相关产品推荐

