当前位置: 首页 > 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.dtcms.com/a/270196.html

相关文章:

  • 10倍处理效率提升!阿里云大数据AI平台发布智能驾驶数据预处理解决方案
  • Tomcat:启用https(Windows)
  • AR/VR 显示画质失真?OAS百叶窗波导案例破难题
  • Spring Cloud 企业项目技术选型
  • Fiddler-关于抓取Android手机包,安装证书后页面加载失败,提示当前证书不可信存在安全风险的问题
  • 力扣-287.寻找重复数
  • Flutter基础(前端教程①-容器和控件位置)
  • 7月5号和6号复习和预习(C++)
  • 初识mysql(一)
  • 论文略读:UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning
  • 无人机报警器探测模块技术解析
  • HDLBits刷题笔记和一些拓展知识(十一)
  • 中文编程开发工具构件系列介绍——数值比较构件
  • 视频网站弹幕系统简易实现
  • Python语言+pytest框架+allure报告+log日志+yaml文件+mysql断言实现接口自动化框架
  • Android Handler机制与底层原理详解
  • RHA《Unity兼容AndroidStudio打Apk包》
  • 什么是2.5G交换机?
  • 【如何下载网页中的视频】
  • 【HarmonyOS】鸿蒙端云一体化开发入门详解 (一)
  • 零基础 Qt 6 在线安装教程
  • vue前置知识-end
  • 呼叫系统对接智能体能解决哪些问题?
  • exFAT文件系统mp4素材文件变0字节的恢复方法
  • Spring中过滤器和拦截器的区别及具体实现
  • ROS平台上使用C++实现A*算法
  • 3423. 循环数组中相邻元素的最大差值 — day97
  • MySQL 8.0 OCP 1Z0-908 题目解析(23)
  • 服务端渲染
  • VMware克隆虚拟机,模板机已提前设置了固定IP,克隆机需要修改的事项