c++ - Visual C++ GC 接口如何启用它以及包含哪个库
问题描述
我开始学习 C++ 中的 GC 接口,并在 Visual 2019 C++ 中运行了一些 Web 上可用的示例,用于以下功能:
上面的每个参考都有一个示例代码,它在我的 VC++ 2019 中编译并成功执行
我想知道的是,VS2019 默认启用了 GC - 我的意思是我们不需要启用一些编译器开关或库来添加链接。
此外,如果 GC 已默认启用,那么为什么我们没有“set_pointer_safety”而只有“ get_pointer_safety ”?
那么我们如何使用 VC++ 中的 GC 特性,例如,由于 GC 导致内存被释放?
解决方案
我开始学习 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-C或Clang 静态分析器感兴趣。
但是编写最先进的高性能 GC 需要付出很多努力,尤其是当您的 C++ 程序是多线程时。
PS。在github和gitlab以及其他地方,您会发现一些垃圾收集语言的 C 或 C++ 开源实现,例如this(或GNU guile或Python或GHC或Ocaml)。我建议学习 - 以获取灵感 - 他们的 C++ 或 C 源代码。GCC内部有自己的垃圾收集器(另请参阅我的旧的未维护的GCC MELT项目和我写的几张幻灯片)。
推荐阅读
- shell - Pub Sub 消息仍在队列中但未拉取
- c++ - 更改项目的目录会破坏预编译文件的创建
- mysql - 仅当值等于某物时才使用带有 And 运算符的 Select 语句
- javascript - 是的,验证日期介于 01 01 1901 和当前系统日期之间
- java - TS7053:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“对象”
- angular - 您尝试使用标准 CSS 解析器解析 SCSS;在 Angular 12 更新后使用 postcss-scss 解析器重试
- c++ - Cout 在几行后停止打印(c++)
- java - 在 Java 中静态初始化 EnumMap 的最佳方法是什么
- text-files - 当文本文件有一个字符串后跟括号中的项目时,如何使用 .useDelimiter()
- flutter - 如何将文本保存到 Flutter Web 应用程序的网站子目录,然后让应用程序稍后读取?