1

我听说过几次提到 Ada 支持垃圾收集 --- 并且看看语言设计,显然它是在设计时考虑到这一点的。

我有一个非实时应用程序,垃圾收集对它非常非常有用。但是,我还没有看到任何关于我的编译器 GNAT 可以使用垃圾收集器的消息。这让我很吃惊;甚至 C 也支持垃圾收集,只需链接到 libgc。

如果我只是将 libgc 添加到我的链接器行,它会起作用还是会发生可怕的事情?

4

2 回答 2

1

但是,我没有看到任何关于我的编译器 GNAT 可以使用垃圾收集器的消息。这让我很吃惊;甚至 C 也支持垃圾收集,只需链接到 libgc。

您可以使用针对 JVM 的 GNAT。

认为仅仅链接到libgc不会给你垃圾收集的原因[至少据我所知]是因为 GNAT 没有任何关于如何使用它的概念。但是,鉴于 GNAT 使用 GCC 后端,我不明白为什么它不应该“正常工作”,如果它使用 C。

于 2014-05-23T19:08:11.937 回答
0

我在这里找到了一个 libgc 绑定作为 AdaCL 库的一部分:http: //adacl.sourceforge.net/

但是,libgc 文档还说 libgc 看不到存储在通过 system 分配的块中的指针malloc()。这意味着仅存储在从默认内存池分配的对象中的访问不会被视为根,并且可能随时失效。这使得使用标准 Ada 容器无法存储对可收集对象的访问权限!这也可能适用于辅助堆栈 --- 但我不知道辅助堆栈的用途。

但是,我的调查确实表明垃圾收集确实有效:

while true loop
  p := new big_thing_t;
end loop;

...永远运行。所以这在理论上可能是可行的,但现在我认为它不安全。

于 2014-08-17T20:47:34.347 回答