背景: 阅读时Stroustrup 博士的论文 http://www2.research.att.com/~bs和常见问题解答,我注意到一些来自传奇 CS 科学家和程序员的强烈“意见”和很好的建议。其中之一是关于shared_ptr
在 C++0x 中。他开始解释shared_ptr
以及它如何表示所指向对象的共享所有权。在最后一行,他说,我引用 http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr:
. A shared_ptr
代表共享
所有权,但共享所有权不是
我的理想:如果有一个物体就更好了
有明确的所有者和明确的,
可预测的寿命。
我的问题:RAII 在多大程度上替代了垃圾收集等其他设计模式?我假设手动内存管理不用于表示系统中的共享所有权。
RAII 在多大程度上替代了垃圾收集等其他设计模式?我假设手动内存管理不用于表示系统中的共享所有权
嗯,有了 GC,你真的不需要think关于所有权。该物体停留在周围只要anyone需要它。共享所有权是默认的也是唯一的选择。
当然,一切can通过共享所有权来完成。但它有时会导致非常笨拙的代码,因为你can't控制或限制对象的生命周期。你必须使用C#using
块,或try
/finally
在finally子句中使用close/dispose调用来确保对象在超出范围时被清理。
在这些情况下,RAII 更适合:当对象超出范围时,应该进行所有清理自动地.
RAII在很大程度上取代了GC。 99% 的情况下,共享所有权并不是您真正想要的want理想情况下。这是一个可以接受的妥协,作为交换,通过获得垃圾收集器来节省很多麻烦,但它并不真正符合您的要求want. You want资源会在某个时刻消亡。不是之前,也不是之后。当 RAII 成为一个选项时,在这些情况下它会导致更优雅、简洁和健壮的代码。
但 RAII 并不完美。主要是因为它不能很好地处理偶尔的情况,您只是不知道对象的生命周期。只要有人使用它,它就必须保留很长一段时间。但您不想永远保留它(或者只要范围围绕所有客户端,这可能只是主函数的全部)。
在这些情况下,C++ 用户必须“降级”到共享所有权语义,通常通过引用计数来实现shared_ptr
。在这种情况下,GC 会胜出。它可以更稳健地实现共享所有权(例如,能够处理循环),并且更高效(引用计数的摊余成本为huge与像样的 GC 相比)
理想情况下,我希望以一种语言看到两者。大多数时候,我想要 RAII,但偶尔,我有一个资源,我只想把它扔到空中,而不用担心它会在何时何地降落,只相信它会在它落地时被清理掉。这样做是安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)