是什么使语言不愿意/无法纳入RAII
What makes a language unwilling/incapable to incorporate RAII?
我生活在一个C和C++的泡沫中。我写过的任何涉及几百行以上的内容,总是用这两种语言写的。
我到处都听到 RAII (在大多数情况下)是一个独特的成语C++。但究竟是为什么呢?我相信大多数 OOP 语言都会强迫你在堆上创建对象(如果我错了,一定要纠正我),这会导致想要一个 GC 来处理内存管理。但是,首先让堆栈中的东西工作有什么问题/坏处?它对实施事情有什么好处?
也许这延伸到我首先对堆使用缺乏理解。除了在需要之前预先缓存大东西之外,我不太"理解"它的意义。我 99.9% 的代码都涉及指针,只是与旧代码接口!
我到处都听说 RAII(在大多数情况下)是一个独特的 成语C++。
因为大多数其他高级语言要么不直接支持它,要么鼓励你使用其他语言。Java是一个众所周知的例子,finalize
很少使用。C++是推广 RAII 的语言,因为它专注于性能,同时需要异常安全和合理的资源管理。
RAII 主要与堆存储没有任何关系。它指定使用构造函数和析构函数来初始化和销毁资源或数据以及拥有这些资源的对象。从这个意义上说,它还通过将资源绑定到对象及其生存期来定义所有权。
但是有什么问题/不好只是让东西从堆栈中工作 第一名?
如果您有 100MiB 的数据怎么办?当然,这不能在8MiB堆栈上。该堆栈的概念是用于小型且易于缓存的数据。例如基本类型和基本化合物类型,但不是大阵列。也许您的程序尚未处理大量数据。
Python(以及几乎任何其他引用计数语言)也有事实上的RAII。如果某些内容在超出范围时用完了引用,则会收集它。C++方法在安全方面的问题在于,如果在示波器退出后保存了任何东西,如果你没有做一些特别的事情,它就会在当时和那里自我破坏。
这可以通过使用智能指针,各种习语中的任何一种,以及"非常小心"来缓解;关键是它不是自动安全的,所以其他语言不倾向于使用它。对于一个非常努力地追求 RAII 和安全的语言的例子,看看 Rust。从本质上讲,他们在验证这些智能指针和习语方面做得非常出色,并且在编译时要小心谨慎,以两全其美。
然后其他语言有各种类似的"上下文管理器"结构,但它远不及C++的规模,因为一切都是上下文管理器。
- 具有瞬态资源的RAII类
- 不同语言中相同代码的不同行为
- 使用RAII在给定次数的迭代后重新分配资源
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- r语言 - C++ 类型为"const std ::?
- 通用C++/Python 多语言的存在
- 为什么我的 EnumWindowProc 不能用 C 语言编译?
- 了解算法的性能差异(如果以不同的编程语言实现)
- 在文件夹迭代上实现 RAII
- Rextester 语言编译C++问题
- 如何将多种语言设置放在单个 .clang 格式文件中
- 不同语言中的模运算符差异
- 刚接触C++,难以理解语言的细微差别
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 在 RAII 构造中修改 RVO 值是否安全?
- 我的C++语言蛮力算法有问题
- 如何删除已输入的书以及如何使标题,语言和名称在上面放置空格不会出错?
- 是什么使语言不愿意/无法纳入RAII
- 除了C++之外,其他语言的程序员是否使用,知道或理解RAII