Eva*_*oll 13 reference-counting rust
Rust 可以非常优雅地处理引用计数Rc。社区的许多成员似乎不愿意使用它,而是使用该语言的所有权/借用语义。这使得编写的程序变得更简单,但是除了循环引用之外,还有必要吗?
显然,跨线程事情变得更加复杂,因此为了简化我想要学习的内容,“在单线程应用程序中,除了作为写入时优化之外,是否需要引用计数?” 这是 Rust 技能较高水平的反模式吗?
我认为 @kmdreko 基本上是正确的,但是如果没有的话,Rc就很难建模的一个例子是使用“大量”数据过滤查询,分解为多个所有者。基本上,任何时候您将一个“集合”处理为多个其他过滤集合,其中过滤器可能会重叠。
例如,如果您收集了 1000 个图像,并且调用 OpenCV(或其他)来在原始集中查找哪些图像有鸟,哪些图像中有树,则结果集可能会重叠。因此,如果您不使用Rc(或类似的),您要么复制这些可能巨大的图像(可能不需要),要么保留对它们的引用。好的,但是您永远无法释放原始图像集,因为它拥有结果集引用的图像。虽然有解决方法(仅在一个或多个过滤器要求时保留图像),但由于您使用的内存模型,这会导致深度集成程序中潜在的独立部分。或者只是使用Rc它,其他人可以轻松地“访问”它,无论引入它什么,都可以使用该集合“完成”并释放未引用的所有内容,而仍然保留该集合中仍然使用的部分。
我同意Rcand related 可能会被过度使用。我遇到了 C++ 中所有可怕的时间,人们shared_ptr到处乱扔东西,并认为他们在这一点上“很好”(直到应用程序或 DLL 关闭,并且调用“为什么我的应用程序在退出时崩溃”)时间?”开始出现)。也就是说,即使是单线程,有时所有权也需要共享,因此可以将其传递给未知数量的消费者以供以后使用。
与大多数工具一样,有一些方法可以解决某些部分的问题,但这可能会带来更多的痛苦。
Rc当您需要共享所有权时应该使用。使用Arc没有什么不同,但也许它更常见,因为标准线程机制(例如std::thread::spawn需要所有权)。
Rc如果您的数据更像图形(可能具有循环依赖项,但并非必须如此),您仍然可以在单线程环境中使用。在这种情况下,您无法使用基本参考。您可以以规范化的方式表示类似图形的关系,并使用索引或 id 代替引用,但这可能并不总是有利或可能的。当然,如果您使用的Rc结构可以分层表示,Rc则无需使用。
此外,外部函数或结构需要泛型类型或函数的原因有很多'static。在这些情况下,移动、clone()-ing 或共享(与Rc)都是解决方案。
我不会说它Rc本身是一种反模式,它只是另一种工具,但有时有一些方法可以避免它,从而产生更清晰的关系和/或更好的性能。我经常看到RcRust 新手没有完全掌握借用检查器而大量使用。
| 归档时间: |
|
| 查看次数: |
1101 次 |
| 最近记录: |