lll*_*lll 1 smart-pointers rust
我是Rust的新手,并且写作以了解Rust中的“智能指针”。我对智能指针在C ++中的工作方式有基本的了解,并且自几年前以来就一直将其用于内存管理。但是令我非常惊讶的是,Rust也明确提供了这样的实用程序。
因为在这里的教程(https://pcwalton.github.io/2013/03/18/an-overview-of-memory-management-in-rust.html)中,似乎每个原始指针都自动包装了一个智能指针,这似乎非常合理。那么,为什么我们仍然需要这样Box<T>,Rc<T>和Ref<T>东西?根据此规范:https : //doc.rust-lang.org/book/ch15-00-smart-pointers.html
任何评论将被感动很多。谢谢。
您可以将a T和a Box<T>之间的差异视为静态分配的对象和动态分配的对象(后者通过newC ++术语通过表达式创建)之间的差异。
在Rust中,T和都Box<T>代表对引用对象拥有所有权的变量(即,当变量超出范围时,无论对象是按值存储还是按引用存储,该对象都将被销毁)。相反,&T和&mut T代表借款的对象(即这些变量是不负责销毁对象,他们不能活得比对象的所有者)。
默认情况下,您可能想要使用T,但是有时您可能想要(或必须使用)Box<T>。例如,Box<T>如果您要拥有一个T太大而无法分配到位(例如在堆栈上)的对象,则可以使用a 。当对象完全没有已知大小时,也可以使用它,这意味着您存储或传递对象的唯一选择是通过“指针”(Box<T>)。
在Rust中,对象通常是可变的或别名的,但不能两者都可变。如果您给出了对对象的不可变引用,则通常需要等到这些引用结束后才能再次对该对象进行突变。
另外,Rust的不变性是可传递的。如果您不可变地收到对象,则意味着您也可以不可变地访问其内容(以及那些内容的内容,等等)。
通常,所有这些事情都是在编译时强制执行的。这意味着您可以更快地捕获错误,但是仅限于仅表示编译器可以静态证明的内容。
像T和一样Box<T>,您有时可以使用RefCell<T>,这是另一种所有权类型。但是和T和不同Box<T>,RefCell<T>强制执行器在运行时而不是在编译时强制执行借位检查规则,这意味着有时您可以使用它进行安全但不会通过编译器的静态借位检查器的操作。这方面的主要示例是获得对不可变地接收到的对象内部的可变引用(在Rust的静态强制规则下,它将使整个内部不可变)。
的类型Ref<T>和RefMut<T>是的运行时检查当量&T和&mut T分别。
Rust的所有权模型试图促使您编写在编译时就知道对象寿命的程序。这在某些情况下效果很好,但使其他情况难以表达或无法表达。
Rc<T>及其原子同级Arc<T>是的引用计数包装器T。他们为您提供了所有权模型的替代方法。
当您要使用和正确放置对象时,它们很有用,但是在编写代码时,很难(或不可能)确定哪个特定变量应该是该对象的所有者(因此应该请妥善处理)。就像在C ++中一样,这意味着该对象没有单个所有者,并且该对象将由指向该对象的最后一个引用计数包装器处理。
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |