zoukankan      html  css  js  c++  java
  • Rust-智能指针

      指针(pointer)是一个包含内容存地址的变量的通用概念。这个地址引用,或“指向”(points at)一些其它数据。Rust中最常见的指针是之前介绍的引用(reference)。引用以&符号为标志并借用了他们所指向的值。除了引用数据没有任何其它特殊功能。它们也没有任何额外开销,所以应用得最多。

      另一方面,智能指针(smart pointers)是一类数据结构,他们的表现类似指针,但是也拥有额外的元数据和功能。智能指针的概念并不是Rust所独有;其起源于c++并存在于其它语言中,Rust标准库中不同的智能指针提供了多于引用的额外功能。后面将探索的一个例子便是引用计数(reference counting)智能指针类型,其允许数据有多个所有者。引用计数智能指针记录总共有多个所有者,并当没有任何所有者时负责清理数据。

      在Rust中,普通引用和智能指针的一个额外的区别是引用是一类只借用数据的指针;相反,在大部分情况下,智能指针拥有他们指向的数据。

      我们有了解到的一些智能指针,如String和Vec<T>。这些类型都属于智能指针因为它们拥有一些数据并允许你修改它们。它们也带有元数据(比如他们的容量)和额外的功能或保证(String的数据总是有效的uft-8编码)。

      智能指针通常使用结构体实现。智能指针区别于常规结构体的显著特性在于其实现了 DerefDrop trait。Deref trait 允许智能指针结构体实例表现的像引用一样,这样就可以编写既用于引用、又用于智能指针的代码。Drop trait 允许我们自定义当智能指针离开作用域时运行的代码。我们要学习这此trait以及为什么对于智能指针来说他们很重要。

      考虑到智能指针是一个在Rust经常被使用的通用设计模式,我们并不会覆盖所有现存的智能指针。很多库都有自已的智能指针而我们也可以编写属于自已的智能指针。一些是来自标准库中最常用的有:

    • Box<T>,用于在堆上分配值
    • Rc<T>,一个引用计数类型,其数据可以有多个所有者
    • Ref<T>和RefMut<T>,通过RefCell<T>访问。(RefCell<T>是一个在运行时而不是在编译时执行借用规则的类型)。

    另外我们会涉及内部可变性(interior mutability)模式,这是不可变类型暴露改变其内部值的api。我们也会学习讨论引用循环(reference cycles)会如何泄漏内存,以及如何避免。

  • 相关阅读:
    Protobuf通信协议
    python发送消息到activeMQ后java接收到BinaryMessage的坑
    golang time.Duration() 问题
    golang操作redis
    golang之网络编程
    golang之反射
    golang之goroutine和channel
    golang之单元测试
    golang之文件操作
    XmlHelper 工具类
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/14469470.html
Copyright © 2011-2022 走看看