是什么使语言不愿意/无法纳入RAII

What makes a language unwilling/incapable to incorporate RAII?

本文关键字:RAII 语言 不愿意 是什么      更新时间:2023-10-16

我生活在一个C和C++的泡沫中。我写过的任何涉及几百行以上的内容,总是用这两种语言写的。

我到处都听到 RAII (在大多数情况下)是一个独特的成语C++。但究竟是为什么呢?我相信大多数 OOP 语言都会强迫你在堆上创建对象(如果我错了,一定要纠正我),这会导致想要一个 GC 来处理内存管理。但是,首先让堆栈中的东西工作有什么问题/坏处?它对实施事情有什么好处?

也许这延伸到我首先对堆使用缺乏理解。除了在需要之前预先缓存大东西之外,我不太"理解"它的意义。我 99.9% 的代码都涉及指针,只是与旧代码接口!

我到处都听说 RAII(在大多数情况下)是一个独特的 成语C++。

因为大多数其他高级语言要么不直接支持它,要么鼓励你使用其他语言。Java是一个众所周知的例子,finalize很少使用。C++是推广 RAII 的语言,因为它专注于性能,同时需要异常安全和合理的资源管理。

RAII 主要与堆存储没有任何关系。它指定使用构造函数和析构函数来初始化和销毁资源或数据以及拥有这些资源的对象。从这个意义上说,它还通过将资源绑定到对象及其生存期来定义所有权

但是有什么问题/不好只是让东西从堆栈中工作 第一名?

如果您有 100MiB 的数据怎么办?当然,这不能在8MiB堆栈上。该堆栈的概念是用于小型且易于缓存的数据。例如基本类型和基本化合物类型,但不是大阵列。也许您的程序尚未处理大量数据。

Python(以及几乎任何其他引用计数语言)也有事实上的RAII。如果某些内容在超出范围时用完了引用,则会收集它。C++方法在安全方面的问题在于,如果在示波器退出后保存了任何东西,如果你没有做一些特别的事情,它就会在当时和那里自我破坏。

这可以通过使用智能指针,各种习语中的任何一种,以及"非常小心"来缓解;关键是它不是自动安全的,所以其他语言不倾向于使用它。对于一个非常努力地追求 RAII 和安全的语言的例子,看看 Rust。从本质上讲,他们在验证这些智能指针和习语方面做得非常出色,并且在编译时要小心谨慎,以两全其美。

然后其他语言有各种类似的"上下文管理器"结构,但它远不及C++的规模,因为一切都是上下文管理器。