Rom*_*her 9 garbage-collection raii using-statement with-statement object-lifetime
注意:对象生命周期RAII不使用/与块范围RAII
似乎可以使用额外的gc类别,短期对象(经常检查gc类别),长期存在的对象(不常检查gc类别)和资源对象(非常频繁地检查gc类别).或者可能使用额外的引用计数资源对象的gc.
似乎使用/ with style可以通过促进I/O的更多功能风格(原谅我,如果我错了,这不是功能风格)来阻止大量的I/O扩散到地方vs基于对象的RAII的灵活性(因为它更容易).但是一些问题可能需要很难跟踪资源的生命周期.
有没有理由除了避免gc的复杂性和速度,还没有在主流语言上做到这一点?(我知道有些语言在其主要实现中使用引用计数作为gc的一部分,因此,RAII可能在那里工作,但我认为他们的规范没有为某些类型的对象/或所有对象指定引用计数,并且人们使用的其他实现没有引用计数,限制了对象生存期RAII在这些语言中的使用.
PS:他们在perl中有c ++类型的RAII吗?
许多语言使得编写自定义内部块处理器\xe2\x80\xa0比传统的 C++ 更容易(这可能已在最新标准的当前草案中得到解决)。当您拥有这些时,使用 RAII 进行精确资源处理的大部分要求就变得不那么紧迫;你可以这样做:
\n\nusing (Transaction t = makeTX()) {\n // blah\n}\nRun Code Online (Sandbox Code Playgroud)\n\n代替:
\n\n{\n Transaction t = makeTX();\n // blah\n}\nRun Code Online (Sandbox Code Playgroud)\n\n实际上并没有太大的区别,除了当您有多个嵌套using构造时,资源释放的顺序更加清晰。(在我看来,在抛出异常的情况下进行特殊处理也更容易,这对于您想要在错误时回滚的事务之类的事情很有用,但我不希望每个人都同意我的观点。)另请注意有许多不同的编写using构造的方式,其中一些比其他方式更重量级,但我们实际上不需要在这里探讨其中的差异。
鉴于精确的资源处理是以这种不同的方式处理的,对 C++ RAII 风格的需求要少得多,并且使用垃圾收集 (GC) 是可行的,因为它可以处理复杂的情况(即,在难以处理的任何地方)。将对象生命周期绑定到特定范围)更容易。公平地说,在某些情况下,您需要在不平凡的生命周期内进行精确的资源管理,但这些情况对每个人来说都是令人讨厌的。
\n\nPerl 使用垃圾收集并具有廉价的子例程块,就像大多数其他脚本语言以一种或另一种形式一样(因为脚本语言中代码和数据之间的划分比更传统的编译语言更宽松)。据我所知,唯一不使用 GC 的大型脚本语言是 Tcl,这是因为出于技术语义原因,那里的值系统保证无循环,因此引用计数就足够了。不过那里的代码块仍然非常便宜。
\n\n如果我们看看主流编译语言(即,不是脚本语言),那么我们确实在 1990 年左右看到了分歧。那时的语言(包括 C++)往往不假设垃圾收集(除了一些例外,例如 Lisp、Smalltalk 和函数式语言)。编程语言),而此后的语言(特别是 Java 和 C#)确实采用了 GC。我猜想关于这一点存在重大的哲学转变,可能与一些巧妙的实现相结合,这些实现解决了在那之前 GC 中最严重的问题。当您使用 GC 时,您根本不会将 RAII 视为解决方案;而是将 RAII 视为解决方案。它深深植根于 C++ 的世界模型。
\n\n\xe2\x80\xa0我刚刚创造了这个术语。
\n