2

根据here,VC++ 2013 支持Minimal GC。

你们能给我一些例子来说明它的用法吗?

也就是说,有了VC++ 2013,如何使用GC?

我想要的代码示例可能如下所示:

auto p = gcnew int;

有吗?

4

1 回答 1

6

你可能对 C++11 中的 Minimal GC: It doesn't do garbage collection 感到失望!C++11 中的最小垃圾回收支持由两部分组成:

  1. 有一个强制要求不要为每个人“隐藏”指针。当你有一个指针时,你不能混淆这个指向系统的指针,例如,通过将它写入一个稍后读取的文件,或者使用 xor-trick 创建一个双向链表,同时只存储一个指针。该标准谈到了安全派生的指针(相关条款是 3.7.4.3 [basic.stc.dynamic.safety])。
  2. 标准 C++ 库提供了一组接口,可用于识别无法被跟踪为可访问的指针,或者一旦它们不再可访问,就可以这样说。也就是说,您可以定义一组根对象,这些根对象被认为是可用的,并且不应被任何垃圾收集系统视为释放。

然而,没有任何标准可以真正利用这些设施。当然,仅仅因为没有标准,并不意味着不使用作为接口的 Promise。

上述 API 的相关函数在 20.6.4 [util.dynamic.safety] 中定义,要包含的标头是<memory>. 简单来说,这些功能是:

  1. void std::declare_reachable(void* p)说明 ifp是一个非空指针,它p是一个可访问的对象,即使垃圾收集器已经确定它不是。该函数可能会分配内存并因此抛出。
  2. template <typename T> T* std::undeclare_reachable(T* p)说明 if是一个不再可访问p的非空指针。p调用次数undeclare_reachable(p)不得超过declare_reachable(p)同指针调用次数。
  3. void std::declare_no_pointers(char* p, size_t n)声明n从 开始的字节范围p不包含任何指针,即使垃圾收集器已决定内部会有指针。
  4. void std::undeclare_no_pointers(char* p, size_t n)n撤消从 .开始的字节中没有指针的声明p
  5. std::pointer_safety std::get_pointer_safety() noexcept如果实现具有严格的指针安全性,则返回。

认为所有这些函数基本上都可以实现为什么都不做,并返回一个默认值或指定返回类型的参数。这些函数的指针是有一个可移植的系统来通知垃圾收集器关于指针考虑可达和内存区域不跟踪。

将来可能会添加某种程度的垃圾收集或更可能是垃圾收集,但我不确定是否有具体的建议。如果添加了一些东西,它可能是被称为垃圾收集的东西,因为它实际上并没有清理所有垃圾:垃圾收集只会回收无法访问对象的内存,但不会尝试破坏对象!也就是说,系统会给出一个无限生命对象的视图,尽管它可以重用它所在的内存。

于 2013-09-14T11:08:39.463 回答