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 包还原?
在 MS Visual C++ 中启用 VLA(可变长度数组)?