rust String 和 str 区别

1 String / &String

String 类型的变量本质是一个存放在栈上的胖指针(当然调用过程中,不用显示地按指针那样处理),共有三个字段:

  • 1 pointer: 指向实际字符串值的地址,值是存放在堆上可变字节缓冲区;
  • 2 length: 值Vec< u8 >长度 / 元素个数;
  • 3 capacity: 当前缓冲区容量,当值的长度溢出时,寻找新的合适区间,将值重新拷贝分配到新的内存;同时更新三个字段。

&String 则表示对 String 类型数据的一个引用,也可以理解成是对上面所说的胖纸针的一个引用,示意图如下:

在这里插入图片描述

2 str / &str

str表示不可变且长度未知的u8类型数据序列,这样的数据序列是可以存在于内存的多种地方的;由于其长度未知,强安全的RUST在编译时无法通过,所以str类型数据无法独立使用,通常都采取其引用的形式,也就是字符串切片&str,一个存放在栈上的胖指针(指针本身长度是确定的),其包含两个字段:

  • 1 pointer: 指向实际字符串值的地址;
  • 2 length: 数据[u8]长度 / 元素个数。
    示意图如下:
    在这里插入图片描述

3 &String 和 &str的比较

3.1 引用/指针

引用的本质就是指针,使用上略有不同,但这里为了更好地描述,我就把这两者概念模糊地来讲了。

  • 【栈】&String ->【栈】String -> 【堆】value

  • 【栈】&str -> 【?】value (str)
    str可以在
    1)静态存储区(static storage):最常见的字面量 “foo” 类型便是 &'static str;字面量会以硬编码的方式写入程序的二进制文件中,当程序运行时,加载至ROM(Read Only Memory);
    2)堆上缓冲区数据

    // let s: &String = &String::from("rust"); // 隐式推断, 类型会作为&String处理
    let s: &str = &String::from("rust"); // 显示标注,这里&str可以理解成是对String的全长切片
    

    其中,from()里的字符串字面量"rust"也会以硬编码形式写入二进制文件中,程序运行时,加载至ROM;创建String变量时,会在ROM中找到对应字符串,然后拷贝至堆中,返回地址、长度、容量字段。
    在这里插入图片描述

    3)栈上的数据:分配在栈上的< u8 >数组

    use std::str;
    fn main() {let arr: [u8; 4] = [b'r', b'u', b's', b't']; // b 将char unicode转换为utf-8let stack_str: &str = str::from_utf8(&arr).unwrap(); 
    }
    

3.2 类型转换

常见的转化就不赘述了,可以参考这位博主的文章

《rust中String,&str,Vec 和&[u8]的惯用转换》https://zhuanlan.zhihu.com/p/372082802

&String&str 其实都可以看成是对< u8 >序列数据的引用,只不过结合上面的分析可以看出:&String最终指向的数据只会存在于堆上,而&str指向的数据则不然。可以完美地用&str替换&String(表全长String的切片),反过来就不行。
这也是字符串引用类型通常都是使用&str的原因。
在这里插入图片描述

    let s1:&str = &String::from("rust");let s2:&String = &String::from("rust");let s1:&str = "rust";// let s2:&String = "rust"; //类型匹配错误, mismatched types expected reference `&String` found reference `&'static str`

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/110398.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

焊接符号学习

欧美焊接符号举例 4.5------表示焊点直径 【3】------根据图示说明&#xff0c;表示此项为CC项或者SC项 6-------表示此处为第六CC项或者SC项 BETWEEN①AND②------表示①件和②件俩点之间的焊点 12X------表示俩点之间的焊点个数为12个 日本焊接符号举例 A------根据图示&…

JDK10特性

文章目录 JAVA10概述语法层次的变化局部变量的类型推断不能使用类型推断的场景变量的声明初始值nulllambda表达式方法引用为数组静态初始化成员变量不能使用其他不可以的场景 API层次的变化集合的copyOf方法 总结 JAVA10概述 2018年3月21日&#xff0c;Oracle官方宣布JAVA10正…

OSI模型与数据的封装

1、OSI模型 上层|| 七层模型 四层模型|| 应用层| 表示层 应用层 http/ftp/ssh/ftps| 会话层 -----------------------------------------------------------------------| 传输层 传输层 tcp/udp ------------------------------…

解决:Loading class `com.mysql.jdbc.Driver‘. This is deprecated.

1.在连接MySQL数据库时候会出现这个报错 Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unneces…

gitlab操作

1. 配置ssh 点击访问 2. 创建新分支与切换新分支 git branch 新分支名 // 创建 git checkout 新分支名 // 切换到新分支3. 查看当前分支 git branch*所指的就是当前所在分支 4. 本地删除文件后与远程git同步 git add -A git commit -m "del" git push

C++项目实战——基于多设计模式下的同步异步日志系统-⑧-日志落地类设计

文章目录 专栏导读抽象基类StdoutSink类设计FileSink类设计RollBySizeSink类设计日志落地工厂类设计日志落地类整理日志落地拓展测试RollByTimeSink类设计测试代码测试完整代码 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领…

民用大中型无人直升机系统飞行性能飞行试验要求

声明 本文是学习GB-T 42856-2023 民用大中型无人直升机系统飞行性能飞行试验要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了民用大中型无人直升机系统飞行性能飞行试验的内容、目的、条件、实施、数据处理和 结果评定等要…

线性代数的本质(三)——线性方程组

文章目录 线性方程组高斯消元法初等行变换线性方程组的解向量方程齐次线性方程组的解非齐次线性方程组的解 线性方程组 高斯消元法 客观世界最简单的数量关系是均匀变化的关系。在均匀变化问题中&#xff0c;列出的方程组是一次方程组&#xff0c;我们称之为线性方程组(Linea…

第6章_瑞萨MCU零基础入门系列教程之串行通信接口(SCI)

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

稀土系储氢合金 吸放氢反应动力学性能测试方法

声明 本文是学习GB-T 42656-2023 稀土系储氢合金 吸放氢反应动力学性能测试方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了稀土系储氢合金吸/放氢反应动力学性能的测试方法。 本文件适用于采用体积法进行稀土系储氢合金的…

RabbitMQ基础概念-02

RabbitMQ是基于AMQP协议开发的一个MQ产品&#xff0c; 首先我们以Web管理页面为 入口&#xff0c;来了解下RabbitMQ的一些基础概念&#xff0c;这样我们后续才好针对这些基础概念 进行编程实战。 可以参照下图来理解RabbitMQ当中的基础概念&#xff1a; 虚拟主机 virtual hos…

关于老项目从JDK8升级到JDK17所需要注意的细节

文章目录 ☀️1.关于老项目从JDK8升级到JDK17所需要注意的细节&#x1f338;1.1.更新JDK&#x1f338;1.2.修改Idea中的JDK版本&#x1f338;1.3.关于修改过程中遇到的异常&#x1f338;1.4.IDEA工具栏操作Maven正常&#xff0c;但使用mvn命令运行就报错 ☀️1.关于老项目从JDK…