首页 > 解决方案 > Visual C++ GC 接口如何启用它以及包含哪个库

问题描述

我开始学习 C++ 中的 GC 接口,并在 Visual 2019 C++ 中运行了一些 Web 上可用的示例,用于以下功能:

上面的每个参考都有一个示例代码,它在我的 VC++ 2019 中编译并成功执行

我想知道的是,VS2019 默认启用了 GC - 我的意思是我们不需要启用一些编译器开关或库来添加链接。

此外,如果 GC 已默认启用,那么为什么我们没有“set_pointer_safety”而只有“ get_pointer_safety ”?

那么我们如何使用 VC++ 中的 GC 特性,例如,由于 GC 导致内存被释放?

标签: c++c++11visual-c++garbage-collection

解决方案


我开始学习 C++ 中的 GC 接口

你读过 C++11 标准n3337吗?

Visual C++ GC 接口如何启用它以及包含哪个库

正如其他人解释的那样,Visual C++ 中没有真正的 GC

编写一个简单的 垃圾收集器相当容易。

只需阅读GC 手册以获取指导,和/或Dragon Book和/或Lisp In Small Pieces或此Uniprocessor Garbage Collection Techniques论文。

请注意,本着s11n库的精神,可以通过类似于SWIG的工具生成用于 GC 的 C++ 垃圾收集标记或复制例程。

如果您的代码库很小(几十万 C++ 行和几十个 C++ class-es),您甚至可以使用自己的元程序(或使用GPP预处理器或GNU m4 one 或GNU gawk生成GC 支持例程. 如果您可以并且被允许使用最新的GCC(例如2020 年 7 月的GCC 10)编译您的 C++ 代码,请考虑编写您的GCC 插件以生成垃圾收集支持 C++ 代码。另见[本草案][9] 报告,以及其中的参考资料。注意GCC的垃圾收集器

您可能会对Boehm 的保守 GC库、Frama-CClang 静态分析器感兴趣。

但是编写最先进的高性能 GC 需要付出很多努力,尤其是当您的 C++ 程序是多线程时。

PS。在githubgitlab以及其他地方,您会发现一些垃圾收集语言的 C 或 C++ 开源实现,例如this(或GNU guilePythonGHCOcaml)。我建议学习 - 以获取灵感 - 他们的 C++ 或 C 源代码。GCC内部有自己的垃圾收集器(另请参阅我的旧的未维护的GCC MELT项目和我写的几张幻灯片)。


推荐阅读