Rust 的基本类型有哪些,他们存在堆上还是栈上,是否可以COPY?

devtools/2025/2/3 22:08:03/

Rust 的基本类型主要包括以下几类:

1. 整数类型(Integer)

Rust 提供了有符号和无符号的整数类型:

  • 有符号整数(i8, i16, i32, i64, i128, isize
  • 无符号整数(u8, u16, u32, u64, u128, usize

是否实现 Copy trait?
✅ 是的,所有整数类型都实现了 Copy,因此它们在赋值或传递时不会发生所有权转移。

存储位置:
✅ 由于整数是固定大小的标量,它们通常存储在上。


2. 浮点数类型(Floating-Point)

Rust 仅提供 f32f64 两种浮点数类型。

是否实现 Copy trait?
✅ 是的,f32f64 都实现了 Copy

存储位置:
✅ 存储在上。


3. 布尔类型(Boolean)

Rust 使用 bool 类型表示布尔值(truefalse)。

是否实现 Copy trait?
✅ 是的,bool 实现了 Copy

存储位置:
✅ 存储在上。


4. 字符类型(Character)

Rust 使用 char 存储单个 Unicode 字符,占 4 字节(UTF-32)。

是否实现 Copy trait?
✅ 是的,char 实现了 Copy

存储位置:
✅ 存储在上。


5. 元组(Tuple)

元组可以包含多个不同类型的数据,例如:

rust">let tup: (i32, f64, char) = (42, 3.14, 'R');

是否实现 Copy trait?
仅当所有元素都实现了 Copy 时,元组才会自动实现 Copy
例如:

rust">let t1: (i32, f64) = (42, 3.14); // ✅ Copy
let t2: (String, i32) = (String::from("Hello"), 42); // ❌ 不是 Copy

存储位置:
如果所有元素都是栈上数据,元组整体存储在栈上
如果包含堆数据(如 String),整个元组存储在栈上,但 String 的内容在堆上


6. 数组(Array)

数组是固定长度的多个相同类型元素的集合:

rust">let arr: [i32; 3] = [1, 2, 3];

是否实现 Copy trait?
如果元素类型实现了 Copy,数组也实现 Copy

存储位置:
数组整体存储在栈上(因为它的大小在编译时已知)。


7. 切片(Slice)

切片是对数组的一部分的引用:

rust">let arr = [1, 2, 3, 4, 5];
let slice: &[i32] = &arr[1..3]; // `[2, 3]`

是否实现 Copy trait?
❌ 切片本身是引用(&[T]),所以它没有 Copy,但 &T 这样的引用本身实现了 Copy

存储位置:
切片本身存储在栈上,但它指向的数据可能在堆上或栈上


8. String&str

  • String 是可变的、堆分配的字符串类型。
  • &str 是对 String 或字符串字面值的不可变引用。

是否实现 Copy trait?
String 不实现 Copy(因为它在堆上)。
&str 实现 Copy(因为它是引用)。

存储位置:
String 本身(指针、长度、容量)存储在上,但字符串内容存储在上。
&str 引用存储在上,指向的字符串可能在(字面值)或String)上。


9. 结论

类型Copy 实现?主要存储位置
i32 等整数✅ 是
f32/f64✅ 是
bool✅ 是
char✅ 是
(i32, f64)(只包含 Copy 类型)✅ 是
(String, i32)(包含堆数据)❌ 否栈 + 堆
[i32; 3](固定大小数组)✅ 是
[String; 3](堆数据数组)❌ 否栈 + 堆
&str✅ 是栈(但指向的可能在堆上)
String❌ 否栈 + 堆

Rust 的基本类型中,所有标量类型(整数、浮点数、布尔、字符)和只包含 Copy 类型的复合类型(元组、数组)都存储在栈上,并且都实现了 Copy
StringVec<T> 这样涉及堆数据的类型不会自动 Copy,它们的内容存储在堆上


http://www.ppmy.cn/devtools/155840.html

相关文章

Git进阶之旅:tag 标签 IDEA 整合 Git

第一章&#xff1a;tag 标签远程管理 git 标签 tag 管理&#xff1a; 标签有两种&#xff1a; 轻量级标签(lightweight)带有附注标签(annotated) git tag 标签名&#xff1a;创建一个标签git tag 标签名 -m 附注内容 &#xff1a;创建一个附注标签git tag -d 标签名…

VScode使用笔记

VScode打开keil工程的配置 [STM32]从零开始的vs code 连接keil教程_vscode配置keil环境-CSDN博客 补充&#xff1a;包含头文件 vscode编辑keil arm工程中遇到的问题以及解决方法 - 了不起的亮亮 - 博客园

深入解析 CSS 中不常用属性及其相互作用

深入解析 CSS 中不常用属性及其相互作用 **1. CSS 自定义属性&#xff08;CSS Variables&#xff09;****属性示例****作用****布局相关的作用** **2. box-sizing: border-box;****属性示例****作用****布局相关的作用** **3. Flexbox 布局****属性示例****作用****布局相关的作…

在Ubuntu上使用Docker部署DeepSeek

在Ubuntu上使用Docker部署DeepSeek&#xff0c;并确保其可以访问公网网址进行对话&#xff0c;可以按照以下步骤进行&#xff1a; 一、安装Docker 更新Ubuntu的软件包索引&#xff1a; sudo apt-get update安装必要的软件包&#xff0c;这些软件包允许apt通过HTTPS使用存储库…

【周易哲学】生辰八字入门讲解(八)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解【周易哲学】生辰八字入门讲解&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录 一、六亲女命六亲星六亲宫位相互关系 男命六亲星…

ARM架构与编程(基于STM32F103)第四章 纯汇编点灯

这节相对比较简单&#xff0c;了解了汇编指令以后&#xff0c;我们需要进行一些实战训练&#xff0c;使用最基础的汇编指令把第一章寄存器点灯的程序用汇编来实现出来即可&#xff0c;只编写逻辑部分&#xff0c;目的是简化流程方便入门&#xff0c;不涉及到启动流程部分 接下来…

音视频入门基础:RTP专题(8)——使用Wireshark分析RTP

一、引言 通过Wireshark可以抓取RTP数据包&#xff0c;该软件可以从Wireshark Go Deep 下载。 二、通过Wireshark抓取RTP数据包 首先通过FFmpeg将一个媒体文件转推RTP&#xff0c;生成RTP流&#xff1a; ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec copy -an -f rtp …

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中&#xff0c;所有事件都继承自 QEvent &#xff0c;并且每个事件都有特定的标识符&#xff0c;如&#xff1a;Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…