Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ mark(在mark和sweep中)函数如何跟踪可从根访问的对象集?_C++_C_Garbage Collection - Fatal编程技术网

C++ mark(在mark和sweep中)函数如何跟踪可从根访问的对象集?

C++ mark(在mark和sweep中)函数如何跟踪可从根访问的对象集?,c++,c,garbage-collection,C++,C,Garbage Collection,我试图理解标记和扫描算法是如何在一段代码中实际工作的 我知道每次我调用malloc()时,我的malloc()函数都会将内存地址添加到链接列表中?然后,当我想进行垃圾收集时,我调用mark()函数,该函数接收一个“root”对象,然后从那里标记所有可访问的内存地址。然后调用sweep(),它将释放所有未标记的内存地址 我对什么是“根”对象以及标记函数如何决定哪些对象可以从“根”对象访问感到困惑 我想如果有人能给我举一个小例子,说明标记和扫描算法是如何在一段代码中工作的,这会对我很有帮助。。。或者

我试图理解标记和扫描算法是如何在一段代码中实际工作的

我知道每次我调用malloc()时,我的malloc()函数都会将内存地址添加到链接列表中?然后,当我想进行垃圾收集时,我调用mark()函数,该函数接收一个“root”对象,然后从那里标记所有可访问的内存地址。然后调用sweep(),它将释放所有未标记的内存地址

我对什么是“根”对象以及标记函数如何决定哪些对象可以从“根”对象访问感到困惑

我想如果有人能给我举一个小例子,说明标记和扫描算法是如何在一段代码中工作的,这会对我很有帮助。。。或者可以给我指一些参考资料,因为我找不到

多谢各位

通常有一个根集,而不仅仅是一个根对象。根集基本上是所有全局变量和所有当前活动的局部变量(例如,当前在堆栈上的所有局部变量)。向C或C++添加垃圾收集的一个真正困难是,无法检测根集中的指针(例如,如果您将指针写入临时文件,垃圾收集器将不知道要查找它)。 弄清楚从那里可以到达什么意味着任何一个指针都会被检查,它所指向的东西被认为是可以到达的。如果它指向的对象包含一个或多个指针,则它会递归地跟随这些指针,因此所有可以从中访问的对象都被认为是可访问的

使用“精确”垃圾收集器,您可以使用某种类型的信息来告诉垃圾收集器什么是指针。例如,每个对象都可能包含一个类型标记,以说明它是什么类型的对象。然后,您有一个表来告诉GC该类型对象的哪些部分是指针

使用“保守的”垃圾收集器,您只需查看数据的内容,并假设某个东西可能是指针,它就是。不过,您只关心那些进入垃圾收集堆的指针。为了便于讨论,让我们假设一个64位指针和一个8MB的GC堆。这意味着我们在内存中查找任何具有800万个值的对象,这些值可能是GC堆的指针,并假设任何这样的值都是指针,因此堆中该地址处的任何对象都被认为是可访问的(如果是,我们将递归地查找其中可能是指针的任何对象)


虽然它最初听起来(对许多人来说)像是后者经常将所有东西都视为可到达的,但实际上它在实际使用中运行得出奇地好。但是,它确实禁止某些垃圾收集策略。特别是,任何涉及压缩堆的内容都意味着当对象移动时,所有指向对象的指针都需要调整——为此,我们必须确保我们修改的是指向该对象的指针,而不仅仅是某个整数(或字符串等)这恰好有一个看起来可能是指针的值。

我在维基百科关于垃圾收集的文章中找到了这一点:如果对象a指向代码中的对象C。该指针如何转换为内存地址的链表/堆?