关于C++中垃圾收集的标记扫描(懒惰方法)?

Cha*_*han 5 c++ garbage-collection mark-and-sweep

我知道参考计数器技术,但直到今天才阅读名为"编程语言概念"的书,从未听说过标记扫描技术.
根据这本书:

垃圾收集的原始标记扫描过程如下操作:运行时系统根据请求分配存储单元,并根据需要断开指针与单元的连接,而不考虑存储回收(允许垃圾累积),直到它已分配所有可用单元.此时,开始标记扫描过程以收集堆中剩余的所有垃圾.为了便于该过程,每个堆单元具有由收集算法使用的额外指示符位或字段.

根据我的有限理解,C++库中的智能指针使用引用计数技术.我想知道C++中有没有使用这种智能指针实现的库?由于这本书纯粹是理论上的,我无法想象实现是如何完成的.举例说明这个想法将是非常有价值的.如果我错了,请纠正我.

谢谢,

Mat*_* M. 2

在C++中使用垃圾收集有一个困难,那就是识别什么是指针,什么不是。

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

现在,在 C++0x 中,标准委员会引入了标准 ABI 来帮助实现垃圾收集。在 n3225 中,您可以在20.9.11 指针安全 [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;
Run Code Online (Sandbox Code Playgroud)

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

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