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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:35:56