我听过几次提及Ada支持垃圾收集 - 并且在查看语言设计时,它显然是考虑到这一点而设计的。
我有一个非实时的应用程序,垃圾收集真的非常有用。但是,我还没有看到任何关于我的编译器GNAT可用的垃圾收集器的提及。这让我很惊讶;甚至C只支持垃圾收集,只需链接libgc。
如果我只是将libgc添加到我的链接器行,它会工作还是会发生可怕的事情?
答案 0 :(得分:1)
但是我还没有看到有任何垃圾收集器 可用于我的编译器,GNAT。这让我很惊讶;甚至C支持 垃圾收集,只需链接libgc。
您可以使用针对JVM的GNAT。
我认为简单地链接libgc
的原因不会给你垃圾收集[至少据我所知]是因为GNAT没有任何关于如何使用的概念它。但是,鉴于GNAT使用GCC后端,我不明白为什么它不应该“只是工作”如果它是w / C.
答案 1 :(得分:0)
我在这里找到了一个libgc绑定作为AdaCL库的一部分:http://adacl.sourceforge.net/
但是,libgc文档还说libgc看不到存储在通过系统malloc()
分配的块中的指针。这意味着仅存储在从默认存储池分配的对象中的访问不会被视为根,并且可以在任何时候无效。这取消了使用标准Ada容器存储访问可收集对象的资格!这可能也应用于辅助堆栈---但我不知道辅助堆栈的用途。
但是,我的调查确实显示垃圾收集天真地起作用:
while true loop
p := new big_thing_t;
end loop;
......永远奔跑。所以它可能是理论上可行的,但是现在我认为它不安全。