如何搭建企业网站并有效暂停服务?
摘要:如何建造企业网站,网站暂停怎么做,网站建设要做哪些前期准备工作,网站建设的规模设想指针 (pointer)是一个包含内存地址的变量的通用概念。这个地址引用&#xff
如何建造企业网站,网站暂停怎么做,网站建设要做哪些前期准备工作,网站建设的规模设想指针 #xff08;pointer#xff09;是一个包含内存地址的变量的通用概念。这个地址引用#xff0c;或 “指向”#xff08;points at#xff09;一些其他数据。Rust 中最常见的指针是第四章介绍的 引用#xff08;reference#xff09;。引用以 符号为标志并借用…指针 pointer是一个包含内存地址的变量的通用概念。这个地址引用或 “指向”points at一些其他数据。Rust 中最常见的指针是第四章介绍的 引用reference。引用以 符号为标志并借用了他们所指向的值。除了引用数据没有任何其他特殊功能。它们也没有任何额外开销所以应用的最多。
另一方面智能指针smart pointers是一类数据结构他们的表现类似指针但是也拥有额外的元数据和功能。智能指针的概念并不为 Rust 所独有其起源于 C 并存在于其他语言中。Rust 标准库中不同的智能指针提供了多于引用的额外功能。本章将会探索的一个例子便是 引用计数 reference counting智能指针类型其允许数据有多个所有者。引用计数智能指针记录总共有多少个所有者并当没有任何所有者时负责清理数据。
在 Rust 中普通引用和智能指针的一个额外的区别是引用是一类只借用数据的指针相反在大部分情况下智能指针 拥有 他们指向的数据。
智能指针通常使用结构体实现。智能指针区别于常规结构体的显著特性在于其实现了 Deref 和 Drop trait。Deref trait 允许智能指针结构体实例表现的像引用一样这样就可以编写既用于引用、又用于智能指针的代码。Drop trait 允许我们自定义当智能指针离开作用域时运行的代码。本章会讨论这些 trait 以及为什么对于智能指针来说他们很重要。
考虑到智能指针是一个在 Rust 经常被使用的通用设计模式本章并不会覆盖所有现存的智能指针。很多库都有自己的智能指针而你也可以编写属于你自己的智能指针。这里将会讲到的是来自标准库中最常用的一些
BoxT用于在堆上分配值RcT一个引用计数类型其数据可以有多个所有者RefT 和 RefMutT通过 RefCellT 访问一个在运行时而不是在编译时执行借用规则的类型。
另外我们会涉及 内部可变性interior mutability模式这时不可变类型暴露出改变其内部值的 API。我们也会讨论 引用循环reference cycles会如何泄露内存以及如何避免。
15.1 使用BoxT指向堆上的数据
最简单直接的智能指针是 box其类型是 BoxT。 box 允许你将一个值放在堆上而不是栈上。留在栈上的则是指向堆数据的指针。
除了数据被储存在堆上而不是栈上之外box 没有性能损失。不过也没有很多额外的功能。它们多用于如下场景
当有一个在编译时未知大小的类型而又想要在需要确切大小的上下文中使用这个类型值的时候当有大量数据并希望在确保数据不被拷贝的情况下转移所有权的时候当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候
我们会在 “box 允许创建递归类型” 部分展示第一种场景。在第二种情况中转移大量数据的所有权可能会花费很长的时间因为数据在栈上进行了拷贝。为了改善这种情况下的性能可以通过 box 将这些数据储存在堆上。接着只有少量的指针数据在栈上被拷贝。第三种情况被称为 trait 对象trait object第十七章刚好有一整个部分 “为使用不同类型的值而设计的 trait 对象” 专门讲解这个主题。所以这里所学的内容会在第十七章再次用上
使用BoxT在堆上储存数据
在讨论 BoxT 的用例之前让我们熟悉一下语法以及如何与储存在 BoxT 中的值进行交互。
fn main() {let b Box::new(5);println!(b {}, b);
}这里定义了变量 b其值是一个指向被分配在堆上的值 5 的 Box。这个程序会打印出 b 5在这个例子中我们可以像数据是储存在栈上的那样访问 box 中的数据。正如任何拥有数据所有权的值那样当像 b 这样的 box 在 main 的末尾离开作用域时它将被释放。这个释放过程作用于 box 本身位于栈上和它所指向的数据位于堆上。
将一个单独的值存放在堆上并不是很有意义。将像单个 i32 这样的值储存在栈上也就是其默认存放的地方在大部分使用场景中更为合适。让我们看看一个不使用 box 时无法定义的类型的例子。
Box允许创建递归类型
Rust 需要在编译时知道类型占用多少空间。
