Rust如何计算Vec占用的总内存(包含结构自身和存储的元素数据)
问题解答
1. 24字节的含义
Rust的Vec<T>类型本身是存储在栈上的胖指针结构,64位系统下固定由三个usize字段组成:
- 指向堆上存储元素的内存区域的指针:占8字节
- 向量当前已存储的元素数量(
len):占8字节 - 向量当前申请的堆内存可容纳的最大元素数量(
capacity):占8字节
三个字段总大小刚好24字节,std::mem::size_of_val计算的是值本身占用的栈内存大小,所以会输出24,这部分不包含堆上存储实际元素的内存开销。
2. 计算向量总消耗内存的实现
总内存 = Vec自身栈上大小 + 堆上存储实际元素的内存大小。如果向量的元素是基础值类型(比如你代码中的i32),堆上内存可以直接用容量 * 单个元素大小计算,实现代码如下:
use std::mem; impl Solution { pub fn find_substring(s: String, words: Vec<String>) -> Vec<i32> { let mut result: Vec<i32> = vec![23, 234, 243, 23, 26, 24, 2345]; // Vec自身栈上大小 let vec_stack_size = mem::size_of_val(&result); // 堆上存储元素的总大小 let vec_heap_size = result.capacity() * mem::size_of::<i32>(); // 总消耗内存 let total_size = vec_stack_size + vec_heap_size; println!("Vec自身栈大小:{}字节,堆存储大小:{}字节,总消耗:{}字节", vec_stack_size, vec_heap_size, total_size); result } }
如果你的向量存储的是带有额外堆分配的类型(比如String、Box<T>等),则需要再递归累加每个元素自身持有的堆内存大小。
内容的提问来源于stack exchange,提问作者zendevil.eth
相关产品推荐
相关产品推荐

