C++11 垃圾收集器 - 为什么和如何

标签 c++ c++11 garbage-collection

C++11's language feature list有:

Minimal support for garbage collection and reachability-based leak detection

(但它似乎在 GCC 和 Clang 中都没有实现。)

标准委员会为什么要引入这种垃圾回收 C++ 语言特性?

C++ 真的需要 GC 吗? RAII 不是这么优秀的模式吗(可以统一用于内存和非内存资源,如套接字、文件、纹理...)?

GC 会破坏使用 RAII 的 C++ 代码模式的一致性吗?

有人说 GC 可以很好地打破循环依赖关系,但是为了这个目的使用像 weak_ptr 这样的智能指针不是很好吗?

如果抛出异常会发生什么?如何修改堆栈展开语义以考虑 GC?

还会引入类似 C# 的 IDisposable 模式吗?

另外,假设C++中引入了GC,指针语法会不会不一样?例如我们会像在 C++/CLI 或 C++/CX 扩展中那样有一些类似帽子的“指针”^ 吗?应该有一种方法可以区分普通的原始指针和“托管”指针,对吧?

最佳答案

该提案没有引入垃圾收集器 - 它只是在某些情况下允许它如果实现选择。该标准只会将这些情况描述为导致未定义的行为。这样做,它放宽了实现的要求,为垃圾收集器提供了最小的余地。

the proposal 中给出的简单示例考虑当你把一个指针指向一个动态分配的对象时,将它与另一个值进行异或,从而隐藏指针值,然后恢复原始指针值以通过它访问对象。在 C++11 之前,这将非常好,并且仍然可以使用。然而,现在这样的操作可能(见下一段)被认为是未定义的行为,这意味着实现可能对指向的对象进行垃圾收集。

标准规定实现可以具有宽松的指针安全,在这种情况下,行为与以前一样,或者严格的指针安全,它允许引入垃圾收集器。

An implementation may have relaxed pointer safety, in which case the validity of a pointer value does not depend on whether it is a safely-derived pointer value. Alternatively, an implementation may have strict pointer safety, in which case a pointer value that is not a safely-derived pointer value is an invalid pointer value unless the referenced complete object is of dynamic storage duration and has previously been declared reachable (20.6.4). [...] It is implementation defined whether an implementation has relaxed or strict pointer safety.

如果指针值指向动态分配的对象并且没有发生任何有趣的事情(在第 3.7.4.3 节中更具体地定义),则指针值是安全派生的指针值。

如果您的实现具有严格的指针安全性,但您仍想对指针做一些有趣的事情而不引入未定义的行为,您可以声明一个指针 p像这样可以到达:

declare_reachable(p);

此函数在 <memory> 中定义 header ,以及相关函数,例如 undeclare_reachable , declare_no_pointers , 和 undeclare_no_pointers .您还可以使用 get_pointer_safety 来确定实现的严格性。 .

关于C++11 垃圾收集器 - 为什么和如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15157591/

相关文章:

c++ - 更改默认复制构造函数 C++

c++ - 如何使用智能指针跟踪类的对象?

python-3.x - 如果使用 anaconda,导入 boost/c++ 时 Python 崩溃

java - 在 Java 中使用弱引用的成本

c++ - 多线程间的获取-释放内存顺序

C++ boost 在 UTC 中获取 unix 时间戳

c++ - 使用 noskipws 从 ifstream 读入字符串时为空字符串

c++ - 钻石传承的幕后发生了什么?

PHP 生成器 - 垃圾收集

java - 为什么这些 Tomcat 服务器的 JVM 每小时执行一次 full GC?