c++ - 关于 C++ 中垃圾收集的标记清除(惰性方法)?

标签 c++ garbage-collection mark-and-sweep

我知道引用计数器技术,但直到今天阅读名为“编程语言概念”的书时才听说过标记清除技术。
据书称:

The original mark-sweep process of garbage collection operates as follow: The runtime system allocates storage cells as requested and disconnects pointers from cells as necessary, without regard of storage reclamation ( allowing garbage to accumulate), until it has allocated all available cells. At this point, a mark-sweep process is begun to gather all the garbage left floating-around in the heap. To facilitate the process, every heap cells has an extra indicator bit or field that is used by the collection algorithm.

据我有限的了解,C++ 库中的智能指针使用引用计数技术。我想知道 C++ 中是否有任何库使用这种智能指针实现?由于这本书纯粹是理论性的,我无法想象它是如何实现的。一个证明这个想法的例子将非常有值(value)。如果我错了,请纠正我。

谢谢,

最佳答案

在 C++ 中使用垃圾回收有一个难点,就是区分什么是指针什么不是。

如果您可以调整编译器为每个对象类型提供此信息,那么您就大功告成,但如果不能,则需要使用保守的方法:扫描内存以搜索可能存在的任何模式看起来像一个指针。这里还有一个“位填充”的难点,人们将位填充到指针中(高位在 64 位中大多未使用)或者将两个不同的指针异或以“节省空间”。

现在,在 C++0x 中,标准委员会引入了标准 ABI 来帮助实现垃圾收集。在 n3225 中,您可以在 20.9.11 Pointer safety [util.dynamic.safety] 中找到它。当然,这假设人们会为他们的类型实现这些功能:

void declare_reachable(void* p); // throw std::bad_alloc
template <typename T> T* undeclare_reachable(T* p) noexcept;

void declare_no_pointers(char* p, size_t n) noexcept;
void undeclare_no_pointers(char* p, size_t n) noexcept;

pointer_safety get_pointer_safety() noexcept;

实现后,它将授权您将任何垃圾收集方案(定义那些功能)插入您的应用程序。当然,在需要的地方实际提供这些操作当然需要一些工作。一种解决方案可能是简单地覆盖 newdelete 但它不考虑指针算法...

最后,垃圾收集有很多策略:引用计数(使用循环检测算法)和标记和清除是主要的不同系统,但它们有不同的风格(是否分代,是否复制/压缩,.. .).

关于c++ - 关于 C++ 中垃圾收集的标记清除(惰性方法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5190007/

相关文章:

c++ - 递归 C++ 函数

c++ - 整数除法,还是 float 乘法?

c - 为什么 GC 中的白色/灰色/黑色?

javascript - 哪些现代浏览器使用标记和清除算法进行垃圾收集?

c++ - “可变”变量只能通过一种 const 方法可变吗?

c++ - ComboBoxEx32 (CComboBoxEx) 键盘行为

Java Finalize() 调用计数

java - Java 中一个对象与另一个对象的弱关联?

java - 内部类与静态嵌套类的 GC 性能下降