当前位置: 首页 > news >正文

Rust 中字符串类型区别解析

在 Rust 中,"hello" 和 String::from("hello") 都表示字符串,但它们在内存表示、所有权和可变性上有本质区别:

1. 类型与内存表示

  • "hello" (字符串字面量):

    • 类型为 &str(字符串切片引用)

    • 存储在程序的只读内存区(如代码段或静态存储区)

    • 编译时大小固定,不可变

    • 内存布局:胖指针(指针 + 长度),不包含容量字段

  • String::from("hello")

    • 类型为 String(堆分配的字符串)

    • 数据存储在堆内存

    • 内存布局:栈上结构(指针 + 长度 + 容量),指向堆数据

2. 所有权与可变性

特性"hello" (&str)String::from("hello") (String)
所有权无所有权(借用)拥有所有权
可变性永远不可变可修改(需声明 mut
生命周期静态('static)或借用动态(随变量作用域结束释放)

3. 性能特点

  • "hello"

    • 零运行时开销(编译时分配)

    • 无堆分配,访问高效

  • String::from("hello")

    • 运行时在堆上分配内存

    • 适合动态构建/修改字符串

4. 相互转换

// &str → String(堆分配复制)
let s: String = "hello".into(); // String → &str(零成本转换)
let slice: &str = &s; 

5. 使用场景

  • 优先使用 &str

    • 函数参数传递(fn foo(s: &str)

    • 读取静态字符串(如配置字面量)

  • 使用 String

    • 需要修改字符串内容

    • 动态构建字符串(如用户输入)

    • 需要所有权的场景(如结构体字段)

示例代码

fn main() {// 字符串字面量(只读内存)let static_str: &str = "hello";// static_str.push('!'); // 错误:不可变// String 类型(堆分配)let mut heap_string = String::from("hello");heap_string.push('!'); // 允许修改// 转换示例let from_static: String = static_str.to_string(); // 复制到堆let from_heap: &str = &heap_string; // 借用为切片println!("Static: {}", static_str);    // "hello"println!("Heap: {}", heap_string);     // "hello!"
}

内存示意图

静态存储区         栈                 堆
+----------+     +-----------+     +-------+
| "hello"  | <-- | ptr/len   |     |       |  <- &str 切片
+----------+     +-----------+     +-------++-----------+     +-------+| ptr       | --> | "hello!" |  <- String| len=6     |     +-------+| capacity=8|     +-----------+

总结:
✅ "hello":高效只读,适合静态文本
✅ String::from("hello"):灵活可变,适合动态操作
根据需求选择合适的类型可优化性能和内存使用。

http://www.lryc.cn/news/582713.html

相关文章:

  • Rust 仿射类型(Affine Types)
  • AR/VR 显示画质失真?OAS百叶窗波导案例破难题
  • Linux网络:UDP socket创建流程与简单通信
  • 深入解析 structuredClone API:现代JS深拷贝的终极方案
  • 【RAG知识库实践】数据源Data Source
  • 使用策略模式 + 自动注册机制来构建旅游点评系统的搜索模块
  • 京东商品评论(2)
  • 机器学习(西瓜书) 第三章 线性模型
  • 【PyTorch】PyTorch中torch.nn模块的激活函数
  • Nuxt.js 静态生成中的跨域问题解决方案
  • maven 发布到中央仓库之 Ignore Licence-04
  • FPGA 47 ,MIG 内存接口生成器深度解析( FPGA 中的 MIG 技术 )
  • 手机解压软件 7z:高效便捷的解压缩利器
  • 【AI智能体】智能音视频-基于乐鑫 ESP32 实现音视频通话
  • 从 CODING 停服到极狐 GitLab “接棒”,软件研发工具市场风云再起
  • 20250708-2-Kubernetes 集群部署、配置和验证-使用kubeadm快速部署一个K8s集群_笔记
  • Safetensors与大模型文件格式全面解析
  • 金融行业信息
  • Android 事件分发机制深度解析
  • Apache DolphinScheduler保姆级实操指南:云原生任务调度实战
  • 【Linux服务器】-安装ftp与sftp服务
  • 二刷(李宏毅深度学习,醍醐灌顶,长刷长爽)
  • .NET nupkg包的深度解析与安全防护指南
  • Linux 信号机制:操作系统的“紧急电话”系统
  • 【时时三省】(C语言基础)指针变量作为函数参数
  • 实战:Android 15 (API 35) 适配 构建踩坑全记录
  • Java零基础笔记07(Java编程核心:面向对象编程 {类,static关键字})
  • EXCEL(带图)转html
  • linux wsl2 docker 镜像复用快速方法
  • 解决阿里云ubuntu内存溢出导致vps死机无法访问 - 永久性增加ubuntu的swap空间 - 阿里云Linux实例内存溢出(OOM)问题修复方案