在Rust中,为何10字符String的size_of_val返回24字节?
Rust中
String类型24字节的构成解析 在arm64架构下,Rust的String本质是一个胖指针,由三个8字节的字段组成,总大小刚好24字节,具体构成如下:
- 指向堆内存的指针(8字节):存储字符串实际字节数据在堆上的起始地址,
String的内容存放在堆中,这个指针用于定位这块堆内存。 - 字符串长度(8字节):记录当前字符串包含的字节数(注意是字节数而非字符数,因为Rust字符串采用UTF-8编码),比如你例子里的"1234567890"实际是10字节,但这个字段的大小固定为8字节,不受实际长度影响。
- 容量(8字节):记录当前堆内存分配的总字节容量,即这块堆内存最多能容纳的字符串字节数。当追加内容导致长度超过容量时,Rust会自动重新分配更大的堆内存。
你可以通过以下代码验证这三个字段的存在:
use std::mem; fn main() { let s = String::from("1234567890"); println!("指针地址: {:p}", s.as_ptr()); println!("长度: {} 字节", s.len()); println!("容量: {} 字节", s.capacity()); println!("总大小: {} 字节", mem::size_of_val(&s)); }
运行后会看到长度为10,容量通常大于等于10(Rust分配器会做优化),而总大小始终是24字节。
补充说明:arm64是64位架构,指针宽度为8字节,因此三个8字节字段相加总大小为24字节;如果是32位架构(如x86),每个字段为4字节,String总大小则为12字节。
内容的提问来源于stack exchange,提问作者mikemaccana
相关产品推荐
相关产品推荐

