【问题标题】:Easy Garbage Collection in CC语言中的简单垃圾收集
【发布时间】:2017-02-20 23:45:40
【问题描述】:

我的主要问题是:如何编写一个简单易懂的 C 垃圾收集算法?我正在尝试学习 C(还不是 C++)并编写自己的 C 垃圾收集算法,但我遇到了问题。我如何知道我的结构何时准备好被释放?我如何知道结构返回后何时准备好在函数内部释放?我应该使用带或不带指针的结构吗?我发现这篇文章说垃圾收集很容易: https://cboard.cprogramming.com/c-programming/94327-garbage-collection-not-so-complicated.html

我想知道“动态对象存储在带有类型标记和标记位的联合中”以及“对对象使用双重间接”是什么意思?这真的是一个简单的方法吗?如何用 C 代码编写?

提前致谢

【问题讨论】:

  • 通过阅读链接,它说它“没那么复杂”,这可能与“它很容易”完全不同。如果你对你的任务没有任何限制,我会认为你的任务“足够复杂” - 最后。
  • 好吧,我会继续努力学习 C。Objective-C 让 ARC 看起来如此简单。
  • gc 本身并不复杂。但是选择正确的方法,实现适合您需求的算法,设计界面以及如何集成到应用程序代码中等等,都需要相当多的经验。恕我直言:从你的问题来看,我怀疑你至少有后者。热情往往不足以进行编程。您首先可能想从不那么复杂的东西开始。
  • 关于 ARC,它看起来很简单,因为 Apple 的团队努力让它看起来像这样。 Apple 的文档将其描述为编译器功能,这意味着其他 Objective-C 库实现(例如 GNUstep)需要类似的编译器支持,包括识别新的生命周期限定符(例如,需要在 GCC/Clang 和/或 Binutils 上工作)。 ARC 使用该编译器支持来确定在何处自动插入保留/释放周期。否则,ARC 是不可能的,因为没有可靠的方法来自动知道何时不再使用对象。

标签: c garbage-collection


【解决方案1】:

进行垃圾收集的超级简单的方法是以某种方式记录对 malloc 位置的引用数。当该计数器达到 0 时,释放()该内存位置。

话虽如此,在 C 中进行垃圾收集可能没有多大意义,因为在 C 中,您没有对象和其他结构,只能“收集”它们,因此您必须更直接地管理内存.

【讨论】:

  • 这个问题已经不太适合堆栈溢出了。并且有很好的理由在 C 中使用 gc。Python 的 C 参考实现还能如何工作? gc 不绑定到 OOP,您也可以在 C 中执行 OOP。如果经过深思熟虑,它甚至并不复杂。
  • 我确信在 C 中使用它有很多理由,我并没有说它无效——但考虑到这个问题与 C++ 与 C 相关,我在质疑这种需要。这在很大程度上取决于您在做什么。
  • 我没有看到任何支持您声称这是“C 与 C++”的说法。而且您在答案中所写的内容甚至不是关于 C++ 的,您实际上是在说“C 中的 gc 没有多大意义”。
  • 我想我已经说清楚了为什么这个问题不应该有答案。仅供参考:我已经为大型 C(和一个程序集)项目实现了各种 GC,否则这些项目会更加复杂(并且不支持他们现在所做的功能)。
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多