如何在C ++中实现垃圾收集 [英] How to implement garbage collection in C++

查看:151
本文介绍了如何在C ++中实现垃圾收集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看到一些关于实现GC在C中的一些帖子,有些人说这是不可能做到的,因为C是弱类型。我想知道如何在C ++中实现GC。

I saw some post about implement GC in C and some people said it's impossible to do it because C is weakly typed. I want to know how to implement GC in C++.

我想知道如何做到这一点。非常感谢!

I want some general idea about how to do it. Thank you very much!

这是我朋友告诉我的彭博面试问题。他当时做得很糟糕。我们想知道你的想法。

This is a Bloomberg interview question my friend told me. He did badly at that time. We want to know your ideas about this.

推荐答案

C和C ++中的垃圾收集都是难题,原因如下:

Garbage collection in C and C++ are both difficult topics for a few reasons:


  1. 指针可以类型转换为整数,反之亦然。这意味着我可以有一个内存块,只有通过获取一个整数,类型转换为指针,然后解除引用。

  1. Pointers can be typecast to integers and vice-versa. This means that I could have a block of memory that is reachable only by taking an integer, typecasting it to a pointer, then dereferencing it. A garbage collector has to be careful not to think a block is unreachable when indeed it still can be reached.

指针不是不透明的,因此垃圾回收器必须小心,不要认为块是不可达的。许多垃圾收集器,像停止和复制收集器,喜欢移动内存块或压缩它们以节省空间。由于可以在C和C ++中显式地查看指针值,因此这可能难以正确实现。

Pointers are not opaque. Many garbage collectors, like stop-and-copy collectors, like to move blocks of memory around or compact them to save space. Since you can explicitly look at pointer values in C and C++, this can be difficult to implement correctly. You would have to be sure that if someone was doing something tricky with typecasting to integers that you correctly updated the integer if you moved a block of memory around.

在C ++中,分配/释放和对象构造/销毁。可以为存储器块分配足够的空间来保存对象,而不在其中实际构建任何对象。一个好的垃圾收集器需要知道,当它回收内存时,是否为任何可能分配的对象调用析构函数。这对于标准库容器尤其如此,因为为了效率的缘故,这些容器经常使用 std :: allocator 来使用这个技巧。

Memory can be allocated from different areas. C and C++ can get memory either from the built-in freestore (malloc/free or new/delete), or from the OS via mmap or other system calls, and, in the case of C++, from get_temporary_buffer or return_temporary_buffer. The programs might also get memory from some third-party library. A good garbage collector needs to be able to track references to memory in these other pools and (possibly) would have to be responsible for cleaning them up.

内存可以从不同的区域分配。 C和C ++可以从内置freestore(malloc / free或new / delete)或从操作系统通过 mmap 或其他系统调用获取内存, C ++的情况,从 get_temporary_buffer return_temporary_buffer 。程序也可能从一些第三方库获取内存。一个好的垃圾收集器需要能够跟踪这些其他池中对内存的引用,并且(可能)必须负责清理它们。

Pointers can point into the middle of objects or arrays. In many garbage-collected languages like Java, object references always point to the start of the object. In C and C++ pointers can point into the middle of arrays, and in C++ into the middle of objects (if multiple inheritance is used). This can greatly complicate the logic for detecting what's still reachable.

指针可以指向对象或数组的中间。在许多垃圾收集语言(如Java)中,对象引用总是指向对象的开始。在C和C ++指针可以指向数组的中间,并在C ++中指向对象的中间(如果使用多重继承)。

So, in short, it's extremely hard to build a garbage collector for C or C++. Most libraries that do garbage collection in C and C++ are extremely conservative in their approach and are technically unsound - they assume that you won't, for example, take a pointer, cast it to an integer, write it to disk, and then load it back in at some later time. They also assume that any value in memory that's the size of a pointer could possibly be a pointer, and so sometimes refuse to free unreachable memory because there's a nonzero chance that there's a pointer to it.

简而言之,构建一个C或C ++的垃圾回收器。大多数使用C和C ++进行垃圾收集的库在它们的方法中非常保守,并且在技术上是不健全的 - 他们假设你不会,例如,接受一个指针,将其转换为整数,写入磁盘,然后加载它回到以后的时间。他们还假设内存中任何一个指针大小的值都可能是一个指针,所以有时拒绝释放无法访问的内存,因为有一个指向它的指针的非零机会。

As others have pointed out, the Boehm GC does do garbage collection for C and C++, but subject to the aforementioned restrictions.

正如其他人所指出的, Boehm GC 对C和C ++执行垃圾回收,但受限于有趣的是,C ++ 11包含一些新的库函数,允许程序员在预期未来的垃圾收集工作中将内存区域标记为可访问和不可访问。在将来可能有可能用这种信息构建一个非常好的C ++ 11垃圾收集器。在此期间,您需要非常小心,不要违反任何上述规则。

Interestingly, C++11 includes some new library functions that allow the programmer to mark regions of memory as reachable and unreachable in anticipation of future garbage collection efforts. It may be possible in the future to build a really good C++11 garbage collector with this sort of information. In the meantime though, you'll need to be extremely careful not to break any of the above rules.

这篇关于如何在C ++中实现垃圾收集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆