2

众所周知,C++11 允许 GC,但没有一个主流编译器支持。

是否有任何讨论何时可以在诸如GCC, MSVC, Intel Compilers,Clang等主流编译器中实现?

我期待使用此功能。

4

3 回答 3

12

你有点误会了。

C++11 支持更好地与 GC 集成,这要归功于一些关键功能,可以帮助他们更好地分析什么是可达的,什么是不可达的。如果您检查新<memory>标题,您会注意到:

  • declare_reachable: 声明一个对象不能被回收
  • undeclare_reachable: 声明一个对象可以被回收
  • declare_no_pointers: 声明一个内存区域不包含可追踪的指针
  • undeclare_no_pointers: 取消 std::declare_no_pointers 的效果

然而,这并不意味着 C++11 建议使用 GC 或推动编译器集成 GC。

一些 GC,例如Boehm-Demers-Weiser的,已经存在。这个新的 API 只是与它们交互的接口的标准化:

  • 正确性:declare_reachable在某些情况下可能会有所帮助,尽管在大多数情况下它应该是自动的
  • 性能:这种 GC 不是类型感知的,并且可能会错误地检测内存区域中包含整数的指针,例如;declare_no_pointers消除了扫描某些内存区域的需要,提高了性能并减少了误报(这反过来又提高了一些性能)

因此,如果您愿意,您已经可以使用 Boehm 的垃圾收集器,C++11 只是通过标准 API 对其进行了改进,以便您可以更轻松地从一个 GC 切换到另一个 GC。

于 2012-05-14T07:01:16.777 回答
5

包含垃圾收集的实现可能不符合 C++98 或 C++03。C++11 添加了足够多的内容以允许一致性,并且只是在此基础上迈出了一小步,试图使其稍微合理。

有一个提议为标准添加更全面的 GC 支持,但被拒绝了。我认为拒绝是很合理的。该提案对标准进行了大约 40 页的更改,但最终所有这些都是为了支持一个非规范的脚注,例如:“预计高质量的实现将尝试最大化程序可用的内存。”

就实现而言,曾经(在 egcs 时代)有人谈论将 Boehm-Demers-Weiser 收集器(的修改版本)合并到 egcs 中。我似乎记得至少有一个版本这样做了,至少在某种程度上(尽管我不记得它是否曾经被认为是“发布”版本)。然而,那是很久以前的事了,据我所知,多年来没有人研究过它。与此同时,Gcc 已经发生了很大的变化,如果今天有人想这样做,他们可能不得不从头开始。

我想这至少摆脱了微软的 C++/CLI 不符合标准的一个领域,所以根据你在其他地方想要多少一致性,你可以(某种程度上)将 C++/CLI 视为带有垃圾的 C++收藏。不过,大多数人认为它不那么恭维(甚至微软也推荐它仅用于链接 .NET 和真正的 C++ 之间的互操作)。

Clang 以 LLVM 为目标,其中包括支持 GC 的钩子(已在其他项目中使用和证明)。因此,它可能是在相对较快的某个时间产生工作实现的最佳机会。

虽然我显然是错的,但我不希望英特尔很快就会整合垃圾收集器。英特尔专注于生成最好的输出代码,而 GC 可能对此无济于事。他们可能这样做的主要原因是简化多线程,这是英特尔投入大量精力的另一个领域(但至少到目前为止,更多的是在库中而不是编译器本身)。

至于 GC 在大多数已发布的 C++ 代码中成为主流使用,似乎几乎没有需求甚至没有兴趣。当我最初写这个答案时,我猜现在有人会写一个。在那段时间里,对 C++ 的 GC 的兴趣似乎已经减弱,以至于我根本不相信它真的有可能再次发生。它仍然可能发生,但我没有看到足够的兴趣来预测可能发生的时间范围。如果有的话,我猜可能会有更多的兴趣转向一个类似 Rust 的模型,该模型明确编码了一些 RAII 语义(但尽管这个总体想法似乎引起了一些兴趣,但我还没有看到任何足够具体的东西来预测它何时是也可能发生)。

于 2012-05-14T08:30:49.073 回答
3

C++11 标准增加了对实现垃圾收集的语言支持,但没有实际工作的垃圾收集器。用于 C++ 的有效 gc 库的最突出示例是Hans Boehm 的 implementation。据我所知,目前没有计划将此库与任何主要编译器集成,但已经多次暗示标准委员会非常有兴趣(*)将垃圾收集器与下一版本的C++。

(*) 例如,参见Going Native 2012 的专家小组

于 2012-05-14T07:00:12.037 回答