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

Posted

技术标签:

【中文标题】Visual C++ GC 接口 如何启用它以及包含哪个库【英文标题】:Visual C++ GC Interface How to enable it and which library to include 【发布时间】:2020-07-11 04:27:08 【问题描述】:

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

std::declare_reachable std::undeclare_reachable std::declare_no_pointers std::undeclare_no_pointers

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

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

另外,如果 GC 是默认启用的,那么为什么我们没有 'set_pointer_safety' 而只有 'get_pointer_safety'?

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

【问题讨论】:

您是否允许使用其他工具,例如Frama-C 或Clang static analyzer 或其他静态源程序分析器? 智能指针的重点是完全避免 gc。你不应该以 Java 为例。 【参考方案1】:

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

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

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

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

编写一个简单 garbage collector 相当容易。

请阅读the GC handbook 以获得指导,和/或Dragon Book,和/或Lisp In Small Pieces 或此Uniprocessor Garbage Collection Techniques 论文。

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

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

您可能对Boehm's conservative GC 库、Frama-C 或Clang static analyzer 感兴趣。

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

PS。在 github 和 gitlab 以及其他地方,您会发现垃圾收集语言的 C 或 C++ 中的几个开源实现,例如this(或GNU guile或Python或GHC或Ocaml)。我建议学习 - 以获取灵感 - 他们的 C++ 或 C 源代码。 GCC 内部有其 own garbage collector(另请参阅我的旧未维护的 GCC MELT 项目和我写的几张幻灯片)。

【讨论】:

【参考方案2】:

Visual C++ 不实现垃圾回收,因此是否/如何启用它或它需要哪些库的问题没有实际意义。

列出的函数的存在并不意味着 GC 存在。这仅意味着 VC++ 实现了 C++11 规定的接口,这些接口允许 GC 工作。但是截至 2019 最新版本还没有提供这样的功能,这些功能的 VC++ 实现只是无操作,“指针安全模型”返回为pointer_safety::relaxed,即根本没有。引用 VC++ memory 标头:

// GARBAGE COLLECTION
enum class pointer_safety  relaxed, preferred, strict ;

inline void declare_reachable(void*) 

template <class _Ty>
_Ty* undeclare_reachable(_Ty* _Ptr) 
    return _Ptr;


inline void declare_no_pointers(char*, size_t) 

inline void undeclare_no_pointers(char*, size_t) 

inline pointer_safety get_pointer_safety() noexcept 
    return pointer_safety::relaxed;

来自 Stroustrup 的 GC ABI 常见问题解答:

宽松: 安全派生和非安全派生的指针被同等对待;像 C 和 C++98 [...]

更多关于 C++11 GC 的内容:

Garbage Collection in C++11

C++11: what is its GC interface, and how to implement?

How to use Minimal GC in VC++ 2013?

【讨论】:

以上是关于Visual C++ GC 接口 如何启用它以及包含哪个库的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中添加多行注释时如何在 Visual Studio 2010 中启用自动星号?

如何在 Visual Studio 中启用 NuGet 包还原?

Visual C++ - 启用优化并浏览优化的代码

在 MS Visual C++ 中启用 VLA(可变长度数组)?

如何使用 Microsoft Visual C++ 2008 编译 PHP 扩展?

如何启用递归函数以避免堆栈溢出?