Rust中声明String的内存分配疑问:栈堆静态区场景辨析
Rust中
String::from("hello world")的内存分配解析 结论:场景B是正确的,具体内存分配逻辑如下:
- 静态内存区:编译时,字符串字面量
"hello world"会被存入静态内存,这部分数据只读且程序运行期间一直存在,但它只是String::from的数据源,并非最终String使用的存储位置。 - 栈内存区:变量
s作为String结构体(等价于Vec<u8>的结构),会占用栈上24字节空间,包含三个核心部分:data:指向堆内存中字符串数据的指针length:当前字符串的字节长度(此处为12)capacity:堆内存分配的总容量(初始和length一致,也是12)
- 堆内存区:
String::from会把静态区的"hello world"内容复制一份到堆内存,栈上s的data指针就指向这块堆内存的起始地址。
为什么场景A错误?
场景A把字符串内容放在栈上,不符合Rust中String的设计逻辑:
- 栈内存是局部、大小固定的,无法支持
String的动态扩容(比如后续调用push_str追加内容); - Rust明确规定
String的字符数据存储在堆上,和Vec的内存模型完全一致——Vec的元素都在堆上,String作为字节的Vec自然遵循这个规则。
内容的提问来源于stack exchange,提问作者Park donghyeon
相关产品推荐
相关产品推荐

