c++ - 是什么让一种语言不愿意/不能包含 RAII?

标签 c++ memory garbage-collection raii

<分区>

我生活在 C 和 C++ 泡沫中。我写过的任何超过几百行的东西都是用这两种语言写的。

我到处都听说 RAII(在大多数情况下)是 C++ 的独特用法。但为什么会这样呢?我相信大多数 OOP 语言都会强制您在堆上创建对象(如果我错了,请务必纠正我),这会导致希望 GC 完全处理内存管理。但是,一开始就让东西从堆栈中工作有什么错/不好?照原样实现有什么好处?

也许这首先导致我对堆的使用缺乏了解。除了在需要之前预先缓存大的东西之外,我不太“明白”它的意义。我 99.9% 的涉及指针的代码都只是与旧代码交互!

最佳答案

I hear around everywhere that RAII is (for the most part) a unique idiom to C++.

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

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

But what's wrong/bad just having stuff work from the stack in the first place?

如果您有 100MiB 的数据怎么办?当然,这不能在 8MiB 堆栈上进行。该堆栈是为小型且易于缓存的数据而设计的。例如。基本类型及其基本复合类型,但不包括大型数组。也许您的程序还没有处理大量数据。

关于c++ - 是什么让一种语言不愿意/不能包含 RAII?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27072846/

相关文章:

c++ - 为什么 std::map 在按值传递给 lambda 时表现异常?

使用链表计算 C 中未知但巨大的文本文件中的单词数

memory - 克隆语句是否被优化过?

Javascript THREEJS 和 GC

c++ - 返回一个 void* 数组

c++ - 如何使用 C++ 在 opencv 中填充二进制矩阵

android - Drawable vs Single reusable Bitmap 更好的内存?

c# - 如何使用 Dispose() 方法处理某些类型(如 Image)

java - 如何附加gc日志

c++ - 如何使用Mongoose(一个http服务器)来服务不同的请求?